这个Java属性继承的例子有什么问题?

mač*_*ček 13 java inheritance

Inheritance.java

public class InheritanceExample {
  static public void main(String[] args){
    Cat c = new Cat();
    System.out.println(c.speak());

    Dog d = new Dog();
    System.out.println(d.speak());
  }
}
Run Code Online (Sandbox Code Playgroud)

Animal.java

public class Animal {
  protected String sound;
  public String speak(){
    return sound;
  }
}
Run Code Online (Sandbox Code Playgroud)

Cat.java

public class Cat extends Animal {
  protected String sound = "meow";
}
Run Code Online (Sandbox Code Playgroud)

Dog.java

public class Dog extends Animal {
  protected String sound = "woof";
}
Run Code Online (Sandbox Code Playgroud)

输出:

null
null
Run Code Online (Sandbox Code Playgroud)

我的动物不会说话.好难过.

Jon*_*eet 10

字段不是多态的.你已经声明了三个完全不同的字段......其中的字段CatDog 阴影隐藏的字段Animal.

最简单的(但不一定是最好的),让你的当前代码的方法是删除soundCatDog,并设置的值继承 sound场在构造函数CatDog.

更好的方法是使Animal抽象的,并给它一个受保护的构造这需要声音...的建设者CatDog再会打电话super("meow")super("woof")分别为:

public abstract class Animal {
    private final String sound;

    protected Animal(String sound) {
        this.sound = sound;
    }

    public String speak(){
        return sound;
    }
}

public class Cat extends Animal {
    public Cat() {
        super("meow");
    }
}

public class Dog extends Animal {
    public Dog() {
        super("woof");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 那么最好的**方式是什么?(你让我问). (2认同)
  • @macek:我到了那里......只要我尽可能快地打字:) (2认同)