我不确定这些问题是否仍然适合被问及,因为已经有了答案。但是,当涉及父类和子类关系中的属性时,我仍然不理解继承的概念。请注意以下示例。
class Animal{
public int lifeSpan = 50;
public String imAn(){
return "I'm an Animal";
}
}
class Elephant extends Animal{
public int lifeSpan = 100;
public String imAn(){
return "I'm an Elephant";
}
}
public class Test{
public static void main(String args[]){
Animal animal = new Elephant();
System.out.println(animal.imAn()+" and i live around "+animal.lifeSpan+" years");
}
}
答案是:我是一只大象,我活了50年左右。
我确实理解了这里的虚方法调用概念,但是它没有加载子类的lifeSpan属性。这是否意味着类属性不是多态的?
答案 0 :(得分:2)
这是否意味着类属性不是多态的?
不,字段不是多态的。实际上,您的Elephant
类中有两个字段 - 一个在Animal
中声明,另一个在Elephant
中声明,隐藏 Animal
中的那个。那就是问题所在。您应该删除lifeSpan
中Elephant
的声明,而是在构造函数中初始化一个剩余字段。
你应该 养成将字段设为私有的习惯 - 并尽可能最终。假设你真的想要一个方法来描述名称(而不是一个更常见的字段),我会把你的代码编写为:
class Animal {
private final int lifeSpan;
public Animal() {
// Default to a life-span of 50
this(50);
}
public Animal(int lifeSpan) {
this.lifeSpan = lifeSpan;
}
public String getName(){
return "Animal";
}
public int getLifeSpan() {
return lifeSpan;
}
}
class Elephant extends Animal {
public Elephant() {
// Give every elephant a life-span of 100.
super(100);
}
@Override public String getName() {
return "Elephant";
}
}
public class Test {
public static void main(String args[]){
Animal animal = new Elephant();
System.out.printf("I am an %s and I live around %d years%n",
animal.getName(), animal.getLifeSpan());
}
}