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

时间:2014-02-11 19:22:03

标签: 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")时,会打印

  

“哺乳动物”

当我致电a.info("test")时,会打印

  

“动物”

为什么Mammal类型调用Mammal info()方法,Animal类型调用Animal info()方法Mammal个对象?

2 个答案:

答案 0 :(得分: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");
    }
}

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

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

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

答案 1 :(得分:0)

因为

public void info(Object o) {
    System.out.print("Animal");
}

不会覆盖

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

他们的签名不同。即一个是Object另一个 - String