Java与Java中的Polymorphic概念有点混淆

时间:2017-06-14 16:48:36

标签: java polymorphism

示例程序:

class Animal {
  public void eat() {
    System.out.println(" Animal eats");
  }
  class Dog extends Animal {
    public void eat(String s) {
      System.out.println(" Dog eats" + s);
    }
    public class Demo {
      public static void main(String args[]){
        Animal a = new Dog();
        Dog d = (Dog) a;
        a.eat();         
        d.eat("Meat");
      }
    }

我的问题是为什么a.eat("Meat")无法访问?由于a在引用Dog Object期间是Object,因此应该允许调用eat("meat")

任何人都可以澄清我哪里出错了吗?

2 个答案:

答案 0 :(得分:2)

您尝试通过基类Press S to stop.'A' Pass # 0 Pass # 1 Pass # 2 'B' Pass # 3 Pass # 4 Pass # 5 etc. 的变量调用子类Dog的方法。

Java具有强类型,因此如果声明类Animal的变量,则只能访问Animal及其超类的方法和字段。 您可以使用强制转换Animal从动物中调用eat("Meat"),但您应该尽可能避免使用此类构造。

顺便说一句,你的方法看起来像是一个函数重载而不是多态。

P.S。关于强打字的this article可能会对您有所帮助。并且this one关于重载和多态之间的区别。

答案 1 :(得分:0)

Dog d = (Dog) a;

您要将Animal a投射到Dog。但是,这不会更改a的类型。 a仍为Animal,因此您只能在没有字符串的情况下调用eat()