2016-11-22 88 views
0

我正在編寫演示繼承使用的程序,並且我使用super()關鍵字創建了一個變量。我現在試圖將該變量的值放入一個調用它的新方法中,以便我可以在我的main方法中調用該方法以在其他類中使用它的值。如何返回超級變量的值?

下面是相關代碼:

食品類(超類)

public class Food { 

    //field that stores the name of the food 
    public String name; 
    //constructor that takes the name of the food as an argument 
    public Food(String name){ 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 
} 

肉類(super關鍵字子類)

public class Meat extends Food 
{ 
public Meat() { 
    super("Meat"); 
} 
    public String getName() { 
     return //get super() value??; 
    } 
} 

主類

public class Main { 

public static void main(String[] args) 
{ 
    Wolf wolfExample = new Wolf(); 
    Meat meatExample = new Meat(); 
    System.out.println("************Wolf\"************"); 
    System.out.println("Wolves eat " + meatExample.getName()); 
    } 
} 

任何幫助表示讚賞,謝謝。

+5

爲什麼當繼承的實現工作正常時,你會重寫'getName'? – user2357112

+2

我知道你的問題是繼承的誤解http://docs.oracle.com/javase/tutorial/java/concepts/inheritance.html – litelite

回答

1

請勿覆蓋Meat類中的public String getName()。 繼承允許在Food的所有子類中繼承公共和受保護的方法Food,因此在Meat中。

所以Meat這是一個Food的定義有這種行爲:

public String getName() { 
     return name; 
    } 

返回存儲在父類中的name領域。

覆蓋子類中的方法以編寫與父方法完全相同的代碼是無用的,不應該這樣做,因爲它具有誤導性。一個讀代碼的人會問:爲什麼在子類中重寫方法,如果它和父類做同樣的事情?


編輯

此外,如果你想從一個子類訪問超類聲明的字段,你應該:

  • 提供超一流的公共的getter如果該字段是私人的。在這裏:

    public String getName() { return name; }

  • 直接使用領域在子類中,如果現場有保護劑。

作爲一般規則,你應該避免聲明實例字段用修飾符公衆,因爲通過對象的默認屬性應該受到保護,你應該提供方法來修改僅在需要的領域。

所以,宣告你的肉類一樣,似乎更適合:

public class Food { 

    //field that stores the name of the food 
    private String name; 
    //constructor that takes the name of the food as an argument 
    public Food(String name){ 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 
} 

在你Meat類,想象你想通過getName()返回的字符串中添加額外的信息,你可以忽略它,爲什麼不使用字段從超類:

public class Meat extends Food { 
    public Meat() { 
    super("Meat"); 
    } 

    @Override 
    public String getName() { 
     return super.getName + "(but don't abuse it)"; 
    } 
} 

這裏覆蓋的方法是有用的,因爲在子類中的方法的行爲不同於它在一個超類。

4

你可以只是做

public String getName() { 
    return super.getName(); 
} 

雖然你甚至都不需要覆蓋的方法擺在首位,因爲你在super類聲明的字段public這意味着它可以是從任何地方訪問。

1

簡單地寫:

public String getName() { 
     return name; 
    } 

這是因爲一個名爲name變量進行搜索時,Java的進行順序:

  1. 局部變量(無)
  2. 當前類的字段(無)
  3. 超級的領域(找到)
  4. 超級超級的領域DS(等)

但是,你並不需要在首位的子類覆蓋getName()。如果你沒有定義它,那麼它會繼承超類的實現,它完全對應你想要的行爲。因此,你做了額外的工作,沒有收穫。

-1

由於食品類具有的getName聲明爲public方法做

public String getName() { 
    return super.getName(); 
} 
0

其他的答案顯示你怎麼做你想要什麼。

但是你不應該這樣做(在現實生活中)!

面向對象編程中最重要的原理是封裝(又名信息隱藏)。這意味着一個班級的內部結構不應該是外部可見的或不可訪問的。
因此所有的成員變量都應該是私有的。

你也應該避免setter/getter方法,因爲它們只是重定向訪問。 (除了該類是沒有任何邏輯的DTO)。