调用super后,抽象类的值为null

时间:2018-10-30 22:01:57

标签: java abstract-class

我有以下程序:

public class Driver {

    public static void main(String[] args) {
        Animal dog = new Dog("larry");
        dog.speak();
    }

}

public abstract class Animal {

    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public abstract void speak();
}

public class Dog extends Animal {

    private String name; // is this even needed?

    public Dog(String name) {
        super(name);
    }

    @Override
    public void speak() {
        System.out.println("I am " + name);

    }
}

运行该程序将打印I am null,这不是我想要的。

为什么不仅仅使用定义为Animal的{​​{1}}变量并打印出name

执行此操作的正确方法是什么?

如果我从larry类中删除了name,是否可以在仍然保留Dog的情况下引用Animal名称变量?

如果是,怎么办?

2 个答案:

答案 0 :(得分:1)

在{p>中使用的name变量

System.out.println("I am " + name);

Dog类中定义的一个。从未设置,因此打印null

无需在nameAnimal中都定义Dog。我的建议是:

  • name删除Dog
  • nameAnimal的可见性更改为protected

如果您希望将对name的访问权限保留为private,请为name的{​​{1}}添加一个“ getter”方法,因此:

Animal

答案 1 :(得分:0)

name中不需要变量Dog;它是与Animal中的变量不同的变量。 Animal构造函数正确初始化了name中的Animal,但是speak中的Dog方法引用了{{1 }}; name中的变量是Dog类代码中范围内的变量。删除Dog中的Dog变量以避免混淆。

但是要使name中的Dog私有并在子类中访问它,请在name中提供一个getter方法。

Animal

然后您可以在Animal中调用它:

public String getName() { return name; }  // or protected

输出:

Dog