Java子类重载不能从超类中调用



当对象的类型是子类(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)的方法(可以被OtherClass2test方法覆盖)。

如果您在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();
  }
}

最新更新