Java 由于编译时异常,无法实例化子类
我是java新手,遇到了这个错误 包含以下内容的封闭实例。。。是必需的 当从与其父类在同一源文件中定义的子类创建新对象时,但当该子类有自己的源文件时,我想理解为什么 主文件:Java 由于编译时异常,无法实例化子类,java,file,subclass,Java,File,Subclass,我是java新手,遇到了这个错误 包含以下内容的封闭实例。。。是必需的 当从与其父类在同一源文件中定义的子类创建新对象时,但当该子类有自己的源文件时,我想理解为什么 主文件: package tessty public class Tessty { public static void main(String[] args) { Person me = new Person(); me.addtoitems(); } } “Person”类的另一
package tessty
public class Tessty {
public static void main(String[] args) {
Person me = new Person();
me.addtoitems();
}
}
“Person”类的另一个源文件:
“Item”类源文件,在同一文件中定义了两个子类:
package tessty;
public class Item {
int weight;
public class Apple extends Item {
public Apple() {
weight = 2;
}
}
public class Shoe extends Item {
public Shoe() {
weight = 3;
}
}
}
最后,是项的另一个子项,但在其自己的源文件中定义:
package tessty;
public class Hat extends Item {
public Hat() {
weight = 1;
}
}
出于组织目的,我真的希望能够在与父类相同的文件中定义子类(我正在处理的应用程序将有许多“小”子类)。有人能解释一下为什么我只在与父类在同一源文件中的子类中出现这个错误吗?这是否与我必须为与父类相同的文件中的子类使用导入,而不是为具有自己文件的子类使用导入有关?首先,您的
Testty
类不编译。你错过了一个代码>在package语句之后:
package tessty;
然后,您可以在一个源文件中定义super和subclass,但其中一个必须是public
,并且只需要package
语句一次(因为这两个类都共享)。例如:
package something;
public class SuperClass {
}
class SubClass extends SuperClass {
}
存储它们的源文件必须命名为SuperClass.java
或者,您可以使子类嵌套并静态
,正如@AndyBrown所回答的那样。您需要使子类起作用。事实就是这样,但在您的案例中使用它们是没有意义的。您也可以将项
抽象化
,因为您不打算创建它的任何实例
如果要在单个文件中创建非嵌套类,则只有一个类可以是public
(见第7.6节底部)。因此,如果您想要多个非嵌套的公共子类,它们必须全部位于单独的文件中
package tessty;
public abstract class Item {
int weight;
public static class Apple extends Item {
public Apple() {
weight = 2;
}
}
public static class Shoe extends Item {
public Shoe() {
weight = 3;
}
}
}
总而言之,课程包括:
- 顶级,如果它们未包含在任何其他类中
- 嵌套,如果它们包含在另一个类中(嵌套可以表示静态或非静态,并声明为成员、本地或匿名类)
在嵌套集合中,它们是:
- 成员,如果它们立即在类定义块中声明
- 如果它们是在方法中声明的
- 如果它们是用实例创建表达式声明的
和嵌套类是:
- 静态成员,如果它们是静态的(因此它们只能是成员)
- 如果它们不是静态的(可以是成员、本地或匿名)
内部类接收对创建它的父类实例的隐式引用。静态成员类对任何父实例都没有隐含的知识。有一个例子你错过了,当你声明SubClasspublic Static
@ControlAltDel时,我相信那就是当你把SubClass
放在超类
里面的时候,对吗?不,在我提供的代码片段中,如果子类
是静态的
(无论公共的
与否),它都不会编译。是的,如果子类被定义为相对于超类的内部类,静态修饰符是有意义的,但因为这里不是这样,所以它很好。但是,即使对于内部类,也不要求将其声明为静态。Apple
和Shoe
需要声明为static
,才能以您尝试的方式工作。谢谢大家,使用static修饰符确实可以消除错误。我没有意识到在同一个源文件中定义一个子类会使它成为一个“内部”类,因此我将继续阅读这些内容。我冒昧地重新命名了您的问题,以更好地反映您的问题,删除任何基于意见的建议,并从标题中删除标记(未来提示:不要在标题中添加标记)。
package tessty;
public abstract class Item {
int weight;
public static class Apple extends Item {
public Apple() {
weight = 2;
}
}
public static class Shoe extends Item {
public Shoe() {
weight = 3;
}
}
}