2013-11-27 72 views
0

同時試圖獲得多態性和繼承的把握,我做了一個小程序來演示這些主題。該計劃由一個超級「樹」和三個小類「樺樹」,「楓樹」和「橡樹」組成。樹的構造函數使得所有樹的起始高度爲20和200葉。在樹中我有一個叫做grow()的抽象方法。從子類訪問和修改超類的屬性?

這裏的代碼樹:

public abstract class Tree { 
private int height; 
private int numberOfLeaves; 

public Tree() 
{ 
    height = 20; 
    numberOfLeaves = 200; 
} 
public Tree(int aheight, int anum) 
{ 
    height = aheight; 
    numberOfLeaves = anum; 
} 

public int getHeight() 
{ 
    return height; 
} 

public int getNumberOfLeaves() 
{ 
    return numberOfLeaves; 
} 

public void setNumberOfLeaves(int anum) 
{ 
    numberOfLeaves = anum; 
} 
public abstract String getType(); 

public void setHeight(int aheight) 
{ 
    height = aheight; 
} 

public abstract void grow(); 

}

下面是生長在樺木()的代碼。

public void grow() 
{ 
    int height = super.getHeight(); 
    super.setHeight(height++); 

    int num = super.getNumberOfLeaves(); 

    super.setNumberOfLeaves(num+=30); 
    System.out.println("The Birch is Growing..."); 

} 

但是,當我調用代碼來增加樹木數組時,它們的高度或樹葉數量都不會改變。 這是我用來填充樹的數組的代碼(我手工做的):

ArrayList<Tree> treeArray = new ArrayList<Tree>(); 

    treeArray.add(new Oak()); 
    treeArray.add(new Birch()); 
    treeArray.add(new Maple()); 

,這裏是我用來調用成長代碼:

for (Tree tree : treeArray) 
    { 
     tree.grow(); 

     System.out.println("The " + tree.getType() + "'s height is " + tree.getHeight() + " and it's number of leaves is "+ tree.getNumberOfLeaves() +"."); 
    } 

顯然,在超值沒有被修改。任何幫助將不勝感激!謝謝!

+2

你可以發佈'樹'的代碼嗎? –

+0

儘管它仍然取決於如何編寫樹類,請嘗試super.setHeight(++ height); – Rudy

+0

好的@ElliottFrisch,我發佈了代碼樹 –

回答

1

你的代碼更改爲:

int height = super.getHeight(); 
super.setHeight(++height); 

注意,你不需要調用super.method()。只要該方法受到保護(公衆更好),您可以將其簡化爲:

int height = getHeight(); 
setHeight(++height); 

您只能調用super。如果您在子類中再次實現該方法,並且想專門調用父類,這通常可以在調用父構造函數的構造函數中看到。

還有一件事:您的訪問者需要改變一點,只是爲了謹慎小心的情況。看下面的代碼。通常你的IDE應該支持自動生成訪問器。

public int getHeight() { 
    return height; 
    } 

    public void setHeight(int height) { 
    this.height = height; 

    } 
+0

即使將高度上的運算符更改爲預增量,仍然不會更改該值;主要功能仍然是身高在20 –

+0

向我們展示樹類和橡樹類 – Rudy

+0

我只是把樹的代碼。橡樹的寫法與樺樹和楓樹幾乎完全相同,除了構造函數的名稱和在grow()中增加了多少葉子。 –

1

此代碼:

int height = super.getHeight(); 
super.setHeight(height++); 

是不會改變任何東西,因爲height的增量將調用super.setHeight()後發生。所以你只需將高度設置爲當前值。

+1

+1 post incement,好點 –