不会从超类调用Java子类重载

时间:2016-10-02 09:17:10

标签: java

当对象的类型是子类(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();
  }
}

3 个答案:

答案 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

它可以按预期工作。

查看更多详情和differences between overriding and overloading

答案 2 :(得分:0)

因为hello();方法位于OtherClass。在goToThing()调用OtherClass2方法之后,您OtherClass2调用hello() OtherClasshello()方法调用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>