2014-09-27 46 views
1

我不確定這些問題是否仍然適合被問,因爲可能已經有答案。但是當涉及父類和子類關係中的屬性時,我仍然不理解繼承的概念。請注意下面的例子。Iinherited字段的值不會更改

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屬性。這是否意味着類屬性不是多態的?

回答

2

這是否意味着類屬性不是多態?

不,字段不是多態。實際上,你已經得到了你的Elephant類領域 - 在Animal聲明並在Elephant宣佈一個一個,這皮革那個在Animal。那就是問題所在。您應該刪除Elephant中的lifeSpan的聲明,而是在構造函數中初始化其餘字段中的一個

你應該養成了私人領域的習慣 - 最後,如果可能的話。假設你真的想有一個方法來描述名稱(而不是字段,這將是更通常的),我會寫你的代碼爲:

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

我可以看到上述問題的更好的實現。謝謝你的解釋。但是我完全覺得如果它的隱藏屬性的範圍是無用的。林不知道,但是,在這種情況下,java應該提供一個編譯時錯誤。我非常欣賞你限制可變私人決賽的方式。 – 2014-09-27 07:19:01

+0

@KumarKailash:它爲什麼會給編譯時錯誤 - 和*哪裏*?請注意,任何具有「Elephant」類型表達式的代碼都將使用在「Elephant」中聲明的字段,任何具有「Animal」類型表達式的代碼都將使用在「Animal」中聲明的字段。從根本上說,問題是你有兩個領域,但只有一個信息。有時候它可能會使層次結構中的兩個類都具有相同名稱的字段 - 但是如果你的字段是私有的(因爲我相信它們幾乎總是),它不會成爲一個問題。 – 2014-09-27 07:24:13

+0

非常感謝。非常有說服力。是的,我同意在層次結構中具有相同名稱的字段沒有任何問題。 – 2014-09-27 07:29:07