java - Java如何选择多态中的重载方法

标签 java inheritance polymorphism

我有两个类定义为:

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");
    }
}

现在我定义两个变量:

Mammal m = new Mammal();
Animal a = new Mammal();

当我调用m.info("test")时,它会打印

"Mammal"

当我调用a.info("test")时,它会打印

"Animal"

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

最佳答案

您正在重载该方法,而不是覆盖它。

重载是在编译时选择的,当 a 的编译时类型为 Animal 时,则调用 a.info("test") 只能解析为 Animal 中的 info(Object) 方法。

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

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

现在,在这两种情况下它都会打印“Mammal”,因为该方法的实现是在执行时根据对象的实际类型选择的。记住它们之间的区别:

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

我还注意到您正在使用嵌套类(否则 static 修饰符将无效)。这不会改变这里的行为,但它确实对类的功能进行了其他更改。我强烈建议您在大多数时间尝试使用顶级类,只有在有真正令人信服的理由时才使用嵌套类型。

关于java - Java如何选择多态中的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21711097/

相关文章:

c++ - 非多态继承对性能/内存使用有影响吗?

java - 如何使用相同的父类(super class)方法初始化不同的子类类型?

c++ - 在继承类中重新定义一个常量成员变量

java - GWT 和异步文件上传 - 帮助

java - 是否存在关于类结构的约定?

Java - 基于毫秒的条件语句

c++ - 基类中的单个 protected 成员变量 VS 派生类中的多个私有(private)成员变量

java - @MappedSuperclass和实现表

java - Java中的四叉 TreeMap 形显示

c++ - 为什么 'Base Class object' 不能调用它自己的虚函数? C++