我有以下程序:
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
名称变量?
如果是,怎么办?
答案 0 :(得分:1)
在{p>中使用的name
变量
System.out.println("I am " + name);
是Dog
类中定义的一个。从未设置,因此打印null
。
无需在name
和Animal
中都定义Dog
。我的建议是:
name
删除Dog
name
中Animal
的可见性更改为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