当对象的类型是子类(OtherClass2)并且测试函数的参数是Person2类型时,为什么下面的代码产生“超级”输出?该方法不应该调用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();
}
}
答案 0 :(得分:1)
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)
的方法(可能被test
OtherClass2
方法覆盖了1}})。
如果您在@Override
之上添加了public void test(Person2 g)
注释,编译器会告诉您此方法不会覆盖超类的任何方法。
答案 1 :(得分:1)
因为OtherClass2中的测试方法不会覆盖OtherClass中的测试(它会重载)。 你有吗
getNick
它可以按预期工作。
答案 2 :(得分:0)
因为hello();
方法位于OtherClass
。在goToThing()
调用OtherClass2
方法之后,您OtherClass2
调用hello()
OtherClass
,hello()
方法调用test()
方法OtherClass
来自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();
}
}
的方法。试试这个:
<style>
.rect{
display:inline-block;
vertical-align:top;
border:solid 1px black;
width:20px;
height:30px;
}
</style>
<div class='rect_cont'>
<div class='rect'></div>
<div class='rect'></div>
</div>