【问题标题】:Declaring a nested class in Java在 Java 中声明一个嵌套类
【发布时间】:2013-05-29 19:49:35
【问题描述】:

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

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 的一个实例。

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

【问题讨论】:

标签: java inheritance declaration nested-class


【解决方案1】:

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

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

public static class FemMedHistory extends MedHistory {...}

通过 MedHistory 类访问它

MedHistory.FemMedHistory myMedHistory = ...

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

【讨论】:

  • 我无法更改文件,所以您能简要告诉我将 FemMedHistory 设为静态类有什么缺点吗?
  • 老实说,它使全局命名空间有点混乱,在这种情况下你想要它,因为它实际上是一个你通常会在它自己的文件中定义的类。通常,如果您在另一个类中创建一个类,那是因为您并不真正关心该 java 文件之外的内部类。本质上,它们通常是与程序的其余部分无关的实用程序类。但这显然不是这里的情况。
【解决方案2】:

您已将您的子类声明为内部类,这意味着您必须先创建包含类的实例才能创建它的实例。

解决此问题的最常见方法是将其声明为单独的类,这样可以消除您的错误。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2015-07-29
      • 2019-03-23
      • 2010-10-31
      相关资源
      最近更新 更多