首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于编译时异常,无法实例化子类。

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

Stack Overflow用户
提问于 2015-01-14 15:51:42
回答 2查看 382关注 0票数 0

我对java很陌生,并且遇到了错误

一个包含.是必需的

当从与父类定义在同一个源文件中的子类创建新对象时,而不是当子类有自己的源文件时,我想了解其中的原因。

主要文件:

代码语言:javascript
运行
复制
package tessty
public class Tessty {
    public static void main(String[] args) {
        Person me = new Person();
        me.addtoitems();
    }
}

"Person“类的另一个源文件:

代码语言:javascript
运行
复制
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“类源文件:

代码语言:javascript
运行
复制
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;
        }
    }

}

最后,项目的另一个子项目,但定义在它自己的源文件中:

代码语言:javascript
运行
复制
package tessty;

public class Hat extends Item {

    public Hat() {
        weight = 1;        
    }

}

为了组织目的,我非常希望能够在同一个文件中定义父类中的子类(我正在处理的应用程序将有许多“小”子类)。请有人解释一下,为什么我只对与他们的父母在同一个源文件中的子类得到这个错误?这与我必须为父文件中的子类使用导入而不是对带有自己文件的子类使用导入有关吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-14 15:59:58

您需要使子类http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html才能正常工作。因为它们是http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html,但是在您的情况下使用这些是没有意义的。您还可以创建Item abstract,因为您不打算创建它的任何实例。

如果要在单个文件中创建非嵌套类,那么只有一个类可以是public (如第7.6节底部的根据联合法律第7条 )。因此,如果您想要多个公共的、非嵌套的子类,它们必须都位于单独的文件中。

代码语言:javascript
运行
复制
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;
        }
    }

}

概括地说,课程是:

  • 如果不包含在任何其他类中,则为顶级
  • 如果嵌套类包含在另一个类中(嵌套可以表示静态或非静态,并声明为成员、本地类或匿名类)

在嵌套集合中,它们是:

  • 如果它们是紧接在类定义块中声明的,则为
  • 如果它们在方法中声明,则为http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html
  • 如果使用实例创建表达式声明它们,则为http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

嵌套类是:

  • 静态成员,如果它们是静态的(因此它们只能是成员)
  • http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html (如果它们不是静态的)(可以是成员,本地的或匿名的)

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

票数 2
EN

Stack Overflow用户

发布于 2015-01-14 15:54:19

首先,您的Testty类不编译。在package语句之后,您错过了一个;

代码语言:javascript
运行
复制
package tessty;

然后,您可以在一个源文件中定义超级类和子类,但是其中一个必须是public,并且只需要package语句一次(因为这两个类都是共享的)。例如:

代码语言:javascript
运行
复制
package something;

public class SuperClass {

}

class SubClass extends SuperClass {

}

源文件将被存储,必须命名为SuperClass.java

或者,您可以使子类(Es)嵌套和static,正如@AndyBrown所回答的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27947037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档