由于编译时异常,无法实例化子类

LR2*_*LR2 0 java file subclass

我是java的新手并且遇到了错误

包含...的封闭实例是必需的

当从与其父文件相同的源文件中定义的子类创建新对象时,但是当子类具有自己的源文件时,则不是这样,并且我想了解原因.

主文件:

package tessty
public class Tessty {
    public static void main(String[] args) {
        Person me = new Person();
        me.addtoitems();
    }
}
Run Code Online (Sandbox Code Playgroud)

"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
    }
}
Run Code Online (Sandbox Code Playgroud)

"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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

最后,Item的另一个子节点,但在其自己的源文件中定义:

package tessty;

public class Hat extends Item {

    public Hat() {
        weight = 1;        
    }

}
Run Code Online (Sandbox Code Playgroud)

我真的希望能够在同一个文件中为子组定义子类以用于组织目的(我正在处理的应用程序将有许多"小"子类).有人可以解释为什么我只是为与他们的父母在同一源文件中的子类收到此错误?是否与我必须对同一文件中的子类使用导入的事实相关,而不是对于具有自己文件的子类?

Kon*_*kov 5

首先,你的Testty类不编译.你错过了一个;包裹声明:

package tessty;
Run Code Online (Sandbox Code Playgroud)

然后,您可以在一个源文件中定义super和subclass,但其中一个必须是,public并且您只需要package一次该语句(因为它为两个类共享).例如:

package something;

public class SuperClass {

}

class SubClass extends SuperClass {

}
Run Code Online (Sandbox Code Playgroud)

他们将被存储的源文件必须被命名SuperClass.java.

或者,您可以将子类嵌套static,并由@AndyBrown回答.