需要包含XYZ的包封实例(an enclosing instance that contains X

2019-09-20 03:32发布

我希望有人能帮助我。 我一直在研究这个问题了几个小时,并没有其他人似乎有同样的问题(我碰到过)。 我必须做一些真正的笨蛋的错误。

我是新来的Java,并设计了一个非常简单的Java程序。

我有一个学生叫抽象超。 这个Student超有3个扩展类称为GraduateUndergraduatePartTime 。 学生类有几个抽象方法和几个非抽象方法。 我已验证中定义的所有抽象方法Students已经在所有3个扩展类中实现。

现在我想要做一些事情,应该是非常简单的。 我试图实例化这些扩展的类之一。 如果我这样做:

Student student = new Student();

Netbeans的说, Student is abstract; can't be instantiated Student is abstract; can't be instantiated 。 好,很好,我明白了为什么抽象类不能被实例化。 然后我试试这个:

Student.Graduate student = new Graduate();

Netbeansan enclosing instance that contains studentmanager.Student.Graduate is required (studentmanager是我的包名)。 我想不通这是什么意思。 但是,我没有弄清楚,我可以实例学生像这样没有错误:

Student[] student = new Student[1];

但是,如果我再尝试做下一个合乎逻辑的做法:

student[0] = new Graduate();

我得到相同an enclosing instance...错误。

底线是,我想知道我怎么可以实例Graduate 。 谁能帮我吗? 任何有识之士将不胜感激!

谢谢。

Answer 1:

你定义GraduateUndergraduatePartTime内部类的Student ? 也就是说,这样的:

public class Student {
    /* ... */
    public class Graduate extends Student { /* ... */ }
    public class Undergraduate extends Student { /* ... */ }
    public class PartTime extends Student { /* ... */ }
}

内部类的实例有封装类的一个实例的隐式引用,以便它可以做的事情一样访问外围实例的私有字段和方法。 当您尝试实例化的一个子类的实例,编译器说:“嘿,抱起来,我不知道该怎么隐含的基准设定为!” 并产生一个误差。

有三种可能的解决方案:

  • 您可以在三个子类出的移动Student类到自己的文件中定义自己的顶级类。
  • 您可以添加关键字static的子类声明的前面。 这告诉你不想从内部类封装类的隐式引用的编译器。 这将阻止你做这样的事情访问Student从子类的私有字段和方法,但如果你不需要做不管怎么说,这是没有实际意义。
  • 如果你确实需要的子类访问的私有成员Student ,你可以创建一个实例Student ,然后用这个特殊的语法来创建内部类的一个实例。

    Student s = new Student();
    Graduate g = s.new Graduate();

s.new在这个例子告诉的新实例编译器Graduate应该有一个隐含的参考s

请注意,在这个例子中,这是不太可能是你想要的。 它是有内部类可以直接修改其外围实例的字段做这样的事情在响应回调更新封装类的状态的情况下,往往是有用的,但我怀疑是不是在这里你的意图。



Answer 2:

如果你可以改变的类定义,内部类必须是为了支持实例化无封闭情况下静态的。 例如

// in file Student.java
public class Student {
    public static class Graduate {}
}

或移动毕业生到自己Graduate.java文件,将让你做

Student.Graduate grad = new Student.Graduate();

否则,改变你实例化这些类麦克d曾建议的方式。



文章来源: an enclosing instance that contains X.Y.Z is required