2016-10-02 15 views
1

オブジェクトの型がサブクラス(OtherClass2)であり、テスト関数の引数がPerson2型である場合、次のコードで "super"という出力が生成されるのはなぜですか?メソッドを呼び出すべきではありませんテスト(新しいPerson2());サブクラスのテスト関数を呼び出しますか? OtherClass2スーパークラスからJavaサブクラスのオーバーロードが呼び出されない

public class HelloWorld 
{ 
    public static void main(String[] args) 
    { 
    OtherClass2 s = new OtherClass2(); 


    s.goToThing(); 
    } 
} 

public class Person 
{ 

} 

public class Person2 extends Person 
{ 

} 

public class OtherClass 
{ 
    public void hello() 
    { 
    test(new Person2()); 
    } 

    public void test(Person p) 
    { 
    System.out.println("in super"); 
    } 
} 

public class OtherClass2 extends OtherClass 
{ 
    public void test(Person2 g) 
    { 
    System.out.println("In sub"); 
    } 

    public void goToThing() 
    { 
    hello(); 
    } 
} 
+0

オーバーロードはコンパイル時に発生します。コンパイラは 'test(Person)'を呼び出すことにします。プログラムが実行されると、サブクラスに 'test(Person)'がないかどうかをチェックします。 – immibis

答えて

1
public void test(Person2 g) 

OtherClass

public void test(Person p) 

を上書きしません。それはそれをオーバーロードします。ただし、コンパイル時の型がOtherClass2(コンパイル時にオーバーロードが決定されるため)の変数に対してのみオーバーロードされます。 OtherClassは(OtherClass2testメソッドによりオーバーライドされている可能性)署名public void test(Person2 g)とは方法がないので

したがって

test(new Person2()); 

は、スーパークラスのメソッドpublic void test(Person p)を呼び出します。

public void test(Person2 g)@Override注釈を追加した場合、コンパイラは、このメソッドがスーパークラスのメソッドをオーバーライドしていないことを伝えていました。

1

OtherClass2のテストメソッドがOtherClassのテストをオーバーライドしないため(オーバーロードされるため) あなたは持っていますか?

public class OtherClass2 extends OtherClass 
{ 
    public void test(Person g) 
    { 
    System.out.println("In sub"); 
    } 

    public void goToThing() 
    { 
    hello(); 
    } 
} 

期待どおりに動作しますか?

さらなる詳細およびdifferences between overriding and overloadingを参照してください。

0

hello();の方法はOtherClassです。 OtherClass2にあるgoToThing()を呼び出し、その後にOtherClass2hello()メソッドを呼び出します。OtherClasshello()メソッドではtest()メソッドをOtherClassから呼び出します。これを試してください:

関連する問題