2013-05-29 144 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概念。而且,这个类真的属于一个单独的文件。