我是java的新手并且遇到了错误
需要包含......的封闭实例
从与其父文件相同的源文件中定义的子类创建新对象时,而不是当子类有自己的源文件时,我想了解原因。
主文件:
package tessty
public class Tessty {
public static void main(String[] args) {
Person me = new Person();
me.addtoitems();
}
}
“Person”类的另一个源文件:
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”类源文件,在同一文件中定义了两个子类:
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;
}
}
}
最后,Item的另一个子节点,但在其自己的源文件中定义:
package tessty;
public class Hat extends Item {
public Hat() {
weight = 1;
}
}
我真的希望能够在同一个文件中为子组定义子类以用于组织目的(我正在处理的应用程序将有许多“小”子类)。有人可以解释为什么我只是为与他们的父母在同一源文件中的子类收到此错误?是否与我必须使用导入同一文件中的子类作为其父类而不是与具有自己文件的子类有关?
答案 0 :(得分:5)
首先,您的Testty
类无法编译。您在包声明后错过了;
:
package tessty;
然后,您可以在一个源文件中定义super和subclass,但其中一个必须是public
,并且您只需要package
语句一次(因为它为两个类共享) 。例如:
package something;
public class SuperClass {
}
class SubClass extends SuperClass {
}
他们将存储的源文件必须命名为SuperClass.java
。
或者,您可以将子类嵌套并static
,如@AndyBrown所述。
答案 1 :(得分:2)
您需要创建子类static member classes才能使其生效。因为它们是inner classes,但在您的案例中使用它们毫无意义。您还可以制作Item
abstract
,因为您并不打算创建任何实例。
如果要在单个文件中创建非嵌套类,则只有一个可以是public
(在第7.6节底部为per the JLS 7)。因此,如果您需要多个公共非嵌套子类,它们必须都在单独的文件中。
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;
}
}
}
总之,课程是:
在嵌套集中,它们是:
嵌套类是:
内部类接收对创建它的父实例的隐式引用。 静态成员类没有任何父实例的隐含知识。