当对象的类型是子类(OtherClass2)并且测试函数的参数是Person2类型时,为什么下面的代码会产生输出"in super" ?方法不应该调用test(new Person2());调用子类的测试函数?
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();
}
}
public void test(Person2 g)
OtherClass2
的不覆盖
public void test(Person p)
的OtherClass
。它超载了。但是,它只对编译时类型为OtherClass2
的变量重载它(因为重载是在编译时确定的)。
test(new Person2());
调用超类的方法public void test(Person p)
,因为OtherClass
没有签名为public void test(Person2 g)
的方法(可以被OtherClass2
的test
方法覆盖)。
如果您在public void test(Person2 g)
之上添加一个@Override
注释,编译器会告诉您该方法不会覆盖父类的任何方法。
因为您在OtherClass2中的测试方法不覆盖OtherClass中的测试(它会重载)。
public class OtherClass2 extends OtherClass
{
public void test(Person g)
{
System.out.println("In sub");
}
public void goToThing()
{
hello();
}
}
它会像预期的那样工作。
查看覆盖和重载的更多细节和区别
因为hello();
方法在OtherClass
中。你调用OtherClass2
中的goToThing()
,之后OtherClass2
调用hello()
方法,OtherClass
中的hello()
方法从OtherClass
调用test()
方法。试试这个:
public class OtherClass2 extends OtherClass
{
public void hello()
{
test(new Person2());
}
public void test(Person2 g)
{
System.out.println("In sub");
}
public void goToThing()
{
hello();
}
}