2013-05-29 143 views
2

我對子類有點困惑。 這裏是我的代碼:在Java中聲明嵌套類

public class MedHistory { 

    private String grafts; 
    private String allergies; 
    private String diseases; 
    private String surgeries; 
    private String medicalTreatment; 

    //Constructors (#2) 

    public MedHistory(String allergies, String diseases, String grafts, 
      String treatments, String surgeries) { 
     this.allergies=allergies; 
     this.diseases=diseases; 
     this.grafts=grafts; 
     this.medicalTreatment=treatments; 
     this.surgeries=surgeries; 
    } 

    public MedHistory() { 
     this.allergies=""; 
     this.diseases=""; 
     this.grafts=""; 
     this.medicalTreatment=""; 
     this.surgeries=""; 
    } 

    //Getters 
    public String getGrafts() { 
     return grafts; 
    } 

    public String getAllergies() { 
     return allergies; 
    } 

    public String getDiseases() { 
     return diseases; 
    } 

    public String getSurgeries() { 
     return surgeries; 
    } 

    public String getMedicalTreatment() { 
     return medicalTreatment; 
    } 

    //Setters 

    public void setGrafts(String grafts) { 
     this.grafts = grafts; 
    } 

    public void setAllergies(String allergies) { 
     this.allergies = allergies; 
    } 

    public void setDiseases(String diseases) { 
     this.diseases = diseases; 
    } 

    public void setSurgeries(String surgeries) { 
     this.surgeries = surgeries; 
    } 

    public void setMedicalTreatment(String medicalTreatment) { 
     this.medicalTreatment = medicalTreatment; 
    } 

    public class FemMedHistory extends MedHistory { 

     private List<Birth> births = new ArrayList<Birth>(); 

     //Constructors (#2) 

     public FemMedHistory(String allergies, String diseases, String grafts,String treatments, String surgeries, List<Birth> birthlist) { 
      super(allergies,allergies,grafts,treatments,surgeries); 
      this.births=birthlist; 
     } 

     public FemMedHistory() { 
      super(); 
      this.births=null; 
     } 

     //Getter 

     public List<Birth> getBirths() { 
      return this.births; 

     } 

     //Setter 

     public void setBirths(List<Birth> list) { 
      this.births=list; 
     } 

    } 
} 

當我嘗試創建一個新的FemMedHistory對象是這樣的:

List<Birth> list = new ArrayList<Birth>(); 
list.add(new Birth(new GregorianCalendar(2011,4,10),"kaisariki",4)); 
FemMedHistory female = new FemMedHistory("allergia2","astheneia2","emvolia2","farmekeutiki agwgi2", "xeirourgeia2", list); 

我得到的錯誤:

No enclosing instance of type MedHistory is accessible. Must qualify the allocation with an enclosing instance of type MedHistory (e.g. x.new A() where x is an instance of MedHistory).

所以,這是正確的方式使用子類?

+1

檢出靜態內部類。 –

+1

其他有用的閱讀:[嵌套類](http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) – informatik01

+1

我會,謝謝你的參考。 – LePhleg

回答

5

當您聲明nested類時,它只能通過Outer類使用。

要在外面訪問它,您需要將FemMedHistory類設爲靜態。

public static class FemMedHistory extends MedHistory {...} 

訪問它通過MedHistory類

MedHistory.FemMedHistory myMedHistory = ... 

或在它自己的Java文件中聲明它。

+0

我不能更改文件,那麼你能簡單地告訴我,FemMedHistory是一個靜態類嗎? – LePhleg

+1

沒有多少誠實,它混亂了全局命名空間,在這種情況下,你想要的,因爲它實際上是一個類,你通常會在它自己的文件中定義。通常情況下,如果你在另一個類中創建一個類,那是因爲你並不關心那個java文件以外的類。實質上,他們通常是實用程序類,與程序的其餘部分無關。但這顯然不是這種情況。 – greedybuddha

+0

我看到..謝謝你清理那個! – LePhleg

3

您已聲明您的子類爲內部類,這意味着如果不首先創建包含類的實例,則無法創建它的實例。

解決此問題的最常見方法是將其聲明爲一個單獨的類,它將擺脫您的錯誤。

3

長話短說:剪下所有的FemMedHistory密碼並粘貼到FemMedHistory.java。現在你已經涉及到你尚未掌握的Java概念。而且,這個類真的屬於一個單獨的文件。