2014-10-29 108 views
-1

所以我有兩個類,一個叫'行星',另一個叫'太陽'。太陽類是父類,行星類是子類,意味着這個類將繼承太陽類的元素。我無法訪問和更改我在父類中初始化的變量,我試圖在子類中複製+修改。Java中的繼承 - 2類

Sun的變量: 大小,顏色

//This is what I've tried: 

public class Planets extends Sun 
{ 
    public Planets (Sun sunClass) 
    { 
     sunClass.size=10; 
     sunClass.colour="BLUE"; 
    } 
} 

//This is what's in Sun class: 
public class Sun 
{ 
    public double size; 
    public String colour; 

    public Sun(double size, String colour) 
    { 
     this.size = size; 
     this.colour = colour; 
    } 
} 

只是假設,但它牽涉到包含更多細節,但不是我有問題的一部分,其他類。

+0

不,有4顆行星金星,火星,汞和地球。他們都有自己的屬性(我假設我需要4種方法?但我不知道如何去做)。 – SassyCoder 2014-10-29 00:38:02

+0

如果您在現實世界中無法有意義地說「行星是太陽」,那麼您不應該在程序中使用繼承。 – dasblinkenlight 2014-10-29 00:38:51

+0

爲什麼你將'Sun'傳遞給'Planets'並修改'Sun'的屬性? – MadProgrammer 2014-10-29 00:38:55

回答

1

它看起來像你要關於錯誤地初始化繼承成員。在java中,您可以使用超級構造函數調用類父類的構造函數。

新的構造:

public Planets() { 
    super(10, "BLUE"); 
} 

,將調用這些價值觀太陽類的構造函數。

或者您可以讓地球類的構造函數發送的大小和顏色:

public Planets(double size, String color) { 
    super(size, color); 
} 

希望這有助於!

+0

如果我爲4個行星創建4種方法,我可以多次使用「超級」(4次)嗎?我感覺它可能會覆蓋數據? – SassyCoder 2014-10-29 00:47:20

+0

在此上下文中,'super'調用超類的構造函數,它只能執行一次,它必須是子類構造函數的第一行。如果你創建4個行星,你有4個不同的對象,每個對象都有自己的超類和構造函數,所以你不會覆蓋任何東西。同樣重要的是要注意,如果你創建4個行星,你不會創建4個子類(除非它們需要不同),你創建了4個子類的_instances_,每個具有不同的屬性。 – 2014-10-29 00:52:49

+0

您不需要多次調用超級構造函數。特別是如果你在這裏使用第二個例子。當你打電話給你時,你可以得到關於這個星球的任何信息(例如'Planets myNewPlanet = new Planets(15,「GREEN」);'然後一個新的星球將被創造出這些價值。類型的行星而不是硬編碼4種不同的行星 – 2014-10-29 01:14:13

0

讓我們忘記太陽是恆星而不是行星。這裏更重要的錯誤是繼承工作是通過從更一般的類派生更多專門的類來實現的。

所以你會:

public class Planet 
{ 
    int size; 
    String color; 
    public Planet (int size, String color) 
    { 
     this.size=size; this.color=color; 
    } 
} 

然後太陽將是一個專業的情況下,即使它在技術上不是一個星球:

public class Sun extends Planet 
{ 


    public Sun() 
    { 
     super(10, "BLUE"); 
    } 
} 

    public class Mars extends Planet 
    { 


     public Sun() 
     { 
      super(3, "RED"); 
     } 
    } 
+0

我的太陽類已經擴展了另一個類(稱爲空間點),它具有訪問器和增變器以返回行星出現的距離和角度 – SassyCoder 2014-10-29 00:59:09

0

夫婦的事情......第一,似乎還有缺乏對什麼是繼承的理解。

在你的榜樣,PlanetsSun延長,這意味着Planets所有Sun做的屬性,加上另外東西,你已經在Planets定義。

如果你試圖修改從Planet內這些特性,你可以這樣做,直接使用super(或this就此而言,如果財產不被子類覆蓋)。

考慮這些類:

public class Sun 
{ 
    public double size; 
    public String colour; 

    public Sun() {} 

    public Sun(double size, String colour) 
    { 
     this.size = size; 
     this.colour = colour; 
    } 
} 

public class Planets extends Sun 
{ 
    public Planets() { 
     super(10.0, "Yellow"); 
    } 
    public Planets (double size, String colour) 
    { 
     super(size, colour); 
    } 

    public void setSize(double size) { 
     super.size = size; 
    } 
} 

注意使用super指示使用超類的構造函數。在PlanetssetSize()方法允許你從子類(儘管在實踐中,你可能不希望使用此層次)

的第二個問題是,你繼承的使用不中設置超屬性的大小似乎很合乎邏輯。不考慮是否使用繼承(is-a)或組合(has-a),如果繼承,通過問自己以下問題將使得使用哪個層次結構變得更容易:我的超類的所有子類都是超類嗎?

+0

我想我誤解了。你想改變太陽的任何屬性,我只是想在太陽類中使用這些變量來爲行星創造新的屬性值。 – SassyCoder 2014-10-29 01:01:55

+0

那麼,繼承性的本質,你已經得到了這個免費...任何東西'Sun'對象自動傳遞給一個子類對象。 – 2014-10-29 01:21:45

0

正如我們所知,子類是從超類繼承的類的名稱,在這種情況下,該類是Sun。但要注意的一個事實是,超類可以擁有任意數量的子類,但沒有限制,但子類只能從一個超類擴展。

只是一個說明。