在Java中声明一个嵌套类

时间:2013-05-29 19:49:35

标签: java inheritance declaration nested-class

我对子类有点困惑。 这是我的代码:

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);

我收到错误:

  

无法访问MedHistory类型的封闭实例。必须符合资格   使用MedHistory类型的封闭实例进行分配(例如   x.new A()其中x是MedHistory的一个实例。)

那么,这是使用子类的正确方法吗?

3 个答案:

答案 0 :(得分:5)

当您声明nested类时,它只能通过Outer类使用。

要在外部访问它,您需要将FemMedHistory类设为静态。

public static class FemMedHistory extends MedHistory {...}

通过MedHistory类

访问它
MedHistory.FemMedHistory myMedHistory = ...

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

答案 1 :(得分:3)

您已将子类声明为内部类,这意味着如果不先创建包含类的实例,则无法创建它的实例。

解决这个问题最常见的方法是将它声明为一个单独的类,它可以消除你的错误。

答案 2 :(得分:3)

长话短说:删除所有FemMedHistory代码并将其粘贴到FemMedHistory.java。现在你已经涉及到尚未掌握的Java概念。此外,该类确实属于单独的文件。