Java如何在多态中选择重载方法

who*_*ows 0 java polymorphism inheritance

我有两个类定义为:

public static class Mammal extends Animal {
    public void info(String s) {
        System.out.print("Mammal");
    }
}

public static class Animal {
    public void info(Object o) {
        System.out.print("Animal");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我将两个变量定义为:

Mammal m = new Mammal();
Animal a = new Mammal();
Run Code Online (Sandbox Code Playgroud)

当我打电话时m.info("test"),它会打印出来

"哺乳动物"

当我打电话时a.info("test"),它会打印出来

"动物"

为什么Mammal类型调用Mammal info()方法,Animal类型Animal info()在它们都是Mammal对象时调用方法?

Jon*_*eet 5

你正在重载方法,而不是覆盖它.

过载被选择在编译时,以及当编译时类型aAnimal,然后到一个呼叫a.info("test")可以解析为info(Object)在方法Animal.

如果要覆盖该方法,则需要使用相同的签名 - 指定@Override注释以使编译器为您检查:

public static class Mammal extends Animal {
    @Override public void info(Object s) {
        System.out.print("Mammal");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在它将在两种情况下都打印"哺乳动物",因为在执行时根据对象的实际类型选择方法的实现.记住它们之间的区别:

  • 重载:在编译时发生,选择方法签名
  • 覆盖:在执行时发生,选择该签名的实现

我还注意到你正在使用嵌套类(否则static修饰符将无效).这不会改变这里的行为,但它会对类的功能进行其他更改.我强烈建议你尝试用顶级类的大部分时间工作,只使用嵌套类型时,有一个真正令人信服的理由这样做.