由于 compile-time 异常,无法实例化子类
Cannot instantiate subclass due to compile-time exception
我是 java 的新手,运行 遇到了错误
An enclosing instance that contains ... is required
从与其 parent 相同的源文件中定义的子 class 创建新的 object 时,但当子 class 有自己的源时则不然文件,我想了解原因。
主文件:
package tessty
public class Tessty {
public static void main(String[] args) {
Person me = new Person();
me.addtoitems();
}
}
"Person"class的另一个源文件:
package tessty;
import tessty.Item.*; // I included this import as per NetBeans' suggestions
public class Person {
Item[] items;
public Person() {
items = new Item[3];
}
public void addtoitems() {
items[0] = new Apple(); // Compile error thrown here
items[1] = new Shoe(); // and here
items[2] = new Hat(); // but not here
}
}
"Item"class源文件中有两个sub-classes定义在同一个文件中:
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;
}
}
}
最后,另一个 child 项,但在其自己的源文件中定义:
package tessty;
public class Hat extends Item {
public Hat() {
weight = 1;
}
}
我真的很希望能够在与 parent class 相同的文件中定义 sub-classes 用于组织目的(我正在处理的应用程序将有很多"small" sub-classes)。有人可以解释为什么我只针对与 parent 位于同一源文件中的 sub-classes 收到此错误吗?这是否与我必须在与他们的 parent 相同的文件中对 sub-classes 使用导入而不是对具有自己的文件的 sub-class 的事实有关?
首先,您的 Testty
class 无法编译。您在包声明后遗漏了 ;
:
package tessty;
然后,你可以在一个源文件中定义 super 和 subclass,但其中一个必须是 public
并且你只需要一次 package
语句(因为它是classes 共享)。例如:
package something;
public class SuperClass {
}
class SubClass extends SuperClass {
}
它们将被存储的源文件必须命名为 SuperClass.java
。
或者,您可以使子 class(es) 嵌套和 static
,如@AndyBrown 所回答。
你需要制作你的子classes static member classes for this to work. As it is they are inner classes,但在你的情况下使用这些没有意义。您也可以制作 Item
abstract
,因为您不打算创建它的任何实例。
如果要在单个文件中创建非嵌套的 classes,则只有一个可以是 public
(如第 7.6 节底部的 per the JLS 7)。因此,如果您想要多个 public 非嵌套子 class,它们必须全部在单独的文件中。
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;
}
}
}
总之,class是:
- 顶级 如果它们没有包含在任何其他 class
- nested 如果它们包含在另一个 class 中(nested 可能意味着 static 或不是,并声明为 member、local 或 anonymous class)
在 嵌套 集合中,它们是:
和嵌套 class是:
- static member 如果它们是静态的(因此它们只能是 member)
- inner 如果它们不是静态的(这些可以是 member、local 或 anonymous)
Inner classes 收到对创建它的父实例的隐式引用。 静态成员 classes 没有任何父实例的隐式知识。
我是 java 的新手,运行 遇到了错误
An enclosing instance that contains ... is required
从与其 parent 相同的源文件中定义的子 class 创建新的 object 时,但当子 class 有自己的源时则不然文件,我想了解原因。
主文件:
package tessty
public class Tessty {
public static void main(String[] args) {
Person me = new Person();
me.addtoitems();
}
}
"Person"class的另一个源文件:
package tessty;
import tessty.Item.*; // I included this import as per NetBeans' suggestions
public class Person {
Item[] items;
public Person() {
items = new Item[3];
}
public void addtoitems() {
items[0] = new Apple(); // Compile error thrown here
items[1] = new Shoe(); // and here
items[2] = new Hat(); // but not here
}
}
"Item"class源文件中有两个sub-classes定义在同一个文件中:
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;
}
}
}
最后,另一个 child 项,但在其自己的源文件中定义:
package tessty;
public class Hat extends Item {
public Hat() {
weight = 1;
}
}
我真的很希望能够在与 parent class 相同的文件中定义 sub-classes 用于组织目的(我正在处理的应用程序将有很多"small" sub-classes)。有人可以解释为什么我只针对与 parent 位于同一源文件中的 sub-classes 收到此错误吗?这是否与我必须在与他们的 parent 相同的文件中对 sub-classes 使用导入而不是对具有自己的文件的 sub-class 的事实有关?
首先,您的 Testty
class 无法编译。您在包声明后遗漏了 ;
:
package tessty;
然后,你可以在一个源文件中定义 super 和 subclass,但其中一个必须是 public
并且你只需要一次 package
语句(因为它是classes 共享)。例如:
package something;
public class SuperClass {
}
class SubClass extends SuperClass {
}
它们将被存储的源文件必须命名为 SuperClass.java
。
或者,您可以使子 class(es) 嵌套和 static
,如@AndyBrown 所回答。
你需要制作你的子classes static member classes for this to work. As it is they are inner classes,但在你的情况下使用这些没有意义。您也可以制作 Item
abstract
,因为您不打算创建它的任何实例。
如果要在单个文件中创建非嵌套的 classes,则只有一个可以是 public
(如第 7.6 节底部的 per the JLS 7)。因此,如果您想要多个 public 非嵌套子 class,它们必须全部在单独的文件中。
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;
}
}
}
总之,class是:
- 顶级 如果它们没有包含在任何其他 class
- nested 如果它们包含在另一个 class 中(nested 可能意味着 static 或不是,并声明为 member、local 或 anonymous class)
在 嵌套 集合中,它们是:
和嵌套 class是:
- static member 如果它们是静态的(因此它们只能是 member)
- inner 如果它们不是静态的(这些可以是 member、local 或 anonymous)
Inner classes 收到对创建它的父实例的隐式引用。 静态成员 classes 没有任何父实例的隐式知识。