Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要包含X.Y.Z的封闭实例_Java_Class_Netbeans_Abstract Class_Instantiation - Fatal编程技术网

Java 需要包含X.Y.Z的封闭实例

Java 需要包含X.Y.Z的封闭实例,java,class,netbeans,abstract-class,instantiation,Java,Class,Netbeans,Abstract Class,Instantiation,我希望有人能帮我。我已经研究这个问题好几个小时了,似乎没有其他人有过相同的问题(我遇到过)。我一定是犯了个愚蠢的错误 我是Java新手,设计了一个非常简单的Java程序 我有一个抽象的超类叫做Student。这个学生超类有3个扩展类,分别称为毕业生、本科生、和兼职。学生班有几个抽象方法和几个非抽象方法。我已经验证了Students中定义的所有抽象方法都已在所有3个扩展类中实现 现在我正在尝试做一些非常简单的事情。我正在尝试实例化其中一个扩展类。如果我这样做: Student student =

我希望有人能帮我。我已经研究这个问题好几个小时了,似乎没有其他人有过相同的问题(我遇到过)。我一定是犯了个愚蠢的错误

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

我有一个抽象的超类叫做Student。这个
学生
超类有3个扩展类,分别称为
毕业生
本科生
、和
兼职
。学生班有几个抽象方法和几个非抽象方法。我已经验证了
Students
中定义的所有抽象方法都已在所有3个扩展类中实现

现在我正在尝试做一些非常简单的事情。我正在尝试实例化其中一个扩展类。如果我这样做:

Student student = new Student();
Netbeans说学生是抽象的;无法实例化。好的,我理解为什么抽象类不能被实例化。然后我试试这个:

Student.Graduate student = new Graduate();
Netbeans说,
需要一个包含studentmanager.Student.Graduate的封闭实例
(studentmanager是我的包名)。我不明白那是什么意思。然而,我确实发现我可以像这样毫无错误地实例化Student:

Student[] student = new Student[1];
但是,如果我尝试做下一件合乎逻辑的事情:

student[0] = new Graduate();
我得到了相同的
封闭实例…
错误

底线是我想知道如何实例化
Graduate
。有人能帮我吗?如有任何见解,将不胜感激


谢谢。

您是否将
毕业生
本科生
兼职
定义为
学生
的内部班级?就是这样,

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=新学生()
    grade g=s.new grade()

本例中的
s.new
告诉编译器
Graduate
的新实例应该隐式引用
s


请注意,在本例中,这不太可能是您想要的。拥有可以直接修改其封闭实例字段的内部类的实例通常很有用,以便执行诸如更新封闭类的状态以响应回调之类的操作,但我怀疑这不是您的意图。

您是否定义了
毕业生
本科生
,和
兼职
作为
学生的内部班级
?就是这样,

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=新学生()
    grade g=s.new grade()

本例中的
s.new
告诉编译器
Graduate
的新实例应该隐式引用
s


请注意,在本例中,这不太可能是您想要的。让内部类的实例可以直接修改其封闭实例的字段,以执行诸如更新封闭类的状态以响应回调之类的操作,这通常很有用,但我怀疑这不是您的意图。

如果您可以更改类定义,内部类必须是静态的,以便在没有封闭实例的情况下支持实例化。e、 g

// in file Student.java
public class Student {
    public static class Graduate {}
}
或者将Graduate移到它自己的Graduate.java文件中,这将让您做到

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

否则,请按照Mike D的建议更改实例化这些类的方式。

如果可以更改类定义,则内部类必须是静态的,以便在没有封闭实例的情况下支持实例化。e、 g

// in file Student.java
public class Student {
    public static class Graduate {}
}
或者将Graduate移到它自己的Graduate.java文件中,这将让您做到

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