继承的字段值不会更改

时间:2014-09-27 07:00:48

标签: java oop

我不确定这些问题是否仍然适合被问及,因为已经有了答案。但是,当涉及父类和子类关系中的属性时,我仍然不理解继承的概念。请注意以下示例。

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属性。这是否意味着类属性不是多态的?

1 个答案:

答案 0 :(得分:2)

  

这是否意味着类属性不是多态的?

不,字段不是多态的。实际上,您的Elephant类中有两个字段 - 一个在Animal中声明,另一个在Elephant中声明,隐藏 Animal中的那个。那就是问题所在。您应该删除lifeSpanElephant的声明,而是在构造函数中初始化一个剩余字段。

你应该 养成将字段设为私有的习惯 - 并尽可能最终。假设你真的想要一个方法来描述名称(而不是一个更常见的字段),我会把你的代码编写为:

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());
    }
}