2012-12-05 127 views
2

你好,我有一個類在Java中繪製了一顆明星,它就像一個魅力一樣。在此之後,我擴展了Star類以創建具有擴展可能性的另一個明星(在這種情況下顏色必須不同)在java中重寫構造函數

由於某種原因,在我的面板中調用類並僅爲構造函數提供參數時孩子班的顏色似乎工作。

這裏是我的代碼

public class Star { 

    protected int radius; 
    protected int xmiddelpunt; 
    protected int ymiddelpunt; 
    protected static Color color; 

    public Star(int radius, int x, int y, Color color) { 
     xmiddelpunt = x; 
     ymiddelpunt = y; 
     this.radius = radius; 

     this.color = color; 
    } 

} 

和擴展類

public class StarRed extends Star { 

    protected int x, y; 
    protected static Color color; 

    Random red = new Random(); 

    public StarRed(int radius, int x, int y, Color color) { 
     super(radius, x, y, color); 

     this.radius = radius; 
     this.x = x; 
     this.y = y; 
     this.color = color; 
    } 
} 

我的面板類的構造函數如下:

ArrayList<Star> stars = new ArrayList<Star>(); 
ArrayList<StarRed> rs = new ArrayList<StarRed>(); 

public HeavenPanel() { 

    setBackground(Color.blue); // geef het paneel een blauwe kleur 


    this.addMouseWheelListener(this); // set de mouselistener 


    for(int i = 0; i < 10; i++) { 
     stars.add(new Star (r.nextInt(30 + 50), r.nextInt(10 + 701), r.nextInt(10 + 701), Color.yellow)); 
    } 

    for(int k = 0; k < 10; k++) { 
     rs.add(new StarRed(40, r.nextInt(30 + 50), r.nextInt(30 + 50), Color.red)); 
    } 

} 
+1

如果您正在擴大班級,它將從父母已完成的工作中獲利。所以,不要在'StarRed'中複製你已經在'Star'中管理的所有屬性(所有這些屬性)。 – SJuan76

+0

你應該發佈你對這些列表所做的事情,否則我們不知道GUI中發生了什麼。 – SJuan76

回答

6

第一個問題:

protected static Color color; 

這意味着,場(你有兩個的...)是在整個類型共享。我本以爲這是一個實例字段,所以不同的星星可以是不同的顏色。相反,所有明星都是相同的顏色,除非你有在StarRed一些代碼,使用color領域,在這種情況下,你可能有明星顏色...但它仍然是不正確的。

問題二:,你StarRed類聲明自己的字段xy,並且color儘管他們也正在超類中聲明。儘管已經在超類構造函數中設置了,但您仍然可以設置超類radius字段的值。

基本上這一切都有點感到迷惘。你應該計算出與類型相關的信息,而不是任何特定的實例(在這種情況下,應該是一個靜態字段)以及哪些信息與單個實例相關聯(在這種情況下,這些信息應該是實例字段)。你應該幾乎永遠不會在一個子類和一個超類中使用相同的字段名稱 - 我個人建議使所有字段私有(除了可能的常量)。

最後,爲什麼會在StarRed構造要採取Color呢?它不應該總是紅色嗎?

+0

啊謝謝!你我有點困惑,但整個問題都是靜態的!我刪除了這個以及我的子類的構造函數中的x和y,非常感謝! – Reshad

+0

有人認爲我不明白...爲什麼我不能給一個this.color = color.red;在我的子類構造器中沒有使它在超類中是靜態的? – Reshad

+0

@Reshad:你應該可以,雖然它是一個受保護的領域。 (我建議*不要*在子類中設置它,因爲您已經將它設置在超類中。)基本上,只存儲任何一條信息,並且只將它放在一個地方。 –

5

要覆蓋靜態變量顏色。

Static關鍵字指類的所有實例具有相同的顏色。

所以,家長和孩子都指的是同一個靜態變量。

因此,因爲您以後設置子顏色只有子顏色的作品。

更改您的密碼和刪除靜態

+0

你不能*覆蓋*一個字段。父母和孩子實際上是指*不同的*靜態變量,因爲每個類聲明自己的靜態變量。 –

1

至於其他的答案說,首先從public static Color color去除靜電。 此外,您不需要在StarRed類中重新聲明Star的字段。從您的Random red = new Random()聲明中,我假設您要在StarRed中進行一些計算以確定紅色的色調,因此您需要添加另一個受保護的Star構造函數,該構造函數省略了設置顏色的操作。你使用StarRedStar的公共構造函數也會使用它,但是另外設置星號的顏色。

您的代碼應該是這樣的:

public class Star { 

    protected int radius; 
    protected int xmiddelpunt; 
    protected int ymiddelpunt; 
    protected Color color; 

    public Star(int radius, int x, int y, Color color) {   
     this(x,y,radius) 
     this.color = color; 
    } 

    protected Star(int radius, int x, int y) { 
     xmiddelpunt = x; 
     ymiddelpunt = y; 
     this.radius = radius; 

     this.color = color; 
    } 


} 

和擴展類

public class StarRed extends Star { 

    Random red = new Random(); 

    // Overrides Star constructor 
    public StarRed(int radius, int x, int y, Color color) { 
     super(radius, x, y); // Call protected superconstructor (radius, x,y) 
     // Now we set the color, so the star is red (example code!) 
     this.color = Color.RED; 
     // You can still use color e.g. to define blue and green components of this.color 

    } 
} 

順便說一句:如果你如從StarRed構造函數中刪除顏色變量,那麼您只需要過載構造函數Star

我希望它有幫助:)

+0

如果我可以添加一些東西,請刪除this.color = color;從你的第二個構造函數的星 – user902383

+0

啊幫助!謝謝! – Reshad