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

时间:2015-01-14 15:51:43

标签: java file subclass

我是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;        
    }

}

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

2 个答案:

答案 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;
        }
    }

}

总之,课程是:

  • 顶级,如果它们未包含在任何其他类
  • 嵌套如果它们被包含在另一个类中(嵌套可能意味着静态,并且声明为成员本地匿名类)

嵌套集中,它们是:

  • 成员如果在类定义块
  • 中立即声明它们
  • local如果在方法中声明它们
  • anonymous如果使用实例创建表达式声明它们

嵌套类是:

  • 静态成员如果它们是静态的(因此它们必须只是成员
  • inner如果它们不是静态的(可以是成员本地匿名

内部类接收对创建它的父实例的隐式引用。 静态成员类没有任何父实例的隐含知识。