0

我正在尝试在 Java 中使用扩展(继承)。我做了一个快速的抽象类来扩展,然后扩展它。但是,我的 IDE 现在说“需要包含 abstract_class 的封闭实例”,并为派生类的构造函数提供了很大的错误行。这到底是怎么回事?抽象类没有或不需要任何类型的构造函数。

仅供参考,我部分使用的是扩展而不是实现,因为我不想为每个相同的派生类维护的实现细节涉及对此使用反射。

编辑:我已经阅读了一些回复。以上帝的名义,什么是静态(或非静态)类?只是为了激怒你们,它并没有解决问题。

// some_class.java
public class some_class {
    public static abstract class abstract_class {
        ...
    }
    ...
}

// Model.java
public class Model extends some_class.abstract_class {
    public Model(...) {
        // No enclosing instance! Critical error.
        ...
    }
    ...
}

而且我认为 C++ 的头文件很糟糕。

4

5 回答 5

2

如果你有

interface MyInterface
{

   abstract class MyAbstractClass {
     // ...
   }
}

然后你试试

class ConcreteClass extends MyAbstractClass {

}

您将收到描述的错误。解决方法是将 MyAbstractClass 移动到顶级类(将其放在它自己的文件中 - 对于非公共类不是绝对必要的,但保持代码组织。)或者,将static修饰符添加到 MyAbstractClass 声明。

于 2010-07-29T16:29:08.513 回答
2

您发布的代码似乎对我来说编译得很好。尝试在您的 IDE 中进行干净的构建,它应该可以工作。

只是为了您自己的好奇心,Java 有两种类型的内部类:static和常规或 ( non-static)。如果您不包含static内部类定义的关键字,则意味着该类的实例将始终需要父类的实例。例如:

public class MyClassOuter {
    //...
    public class MyClassInner {
        //..
    }
}

如果您这样写,则可以理解为 的任何实例都MyClassInner将隐式引用 的实例MyClassOuter.

Static,另一方面,手并不意味着这样的事情。它只是一个恰好在另一个类定义中的类定义。外部类几乎像一个包一样使用(虽然不完全是)。

于 2010-07-29T18:10:14.057 回答
0

“封闭实例”消息几乎可以肯定地暗示您的超类有一个(非静态)内部类。在大多数情况下,内部类可以而且应该是静态的——这可能是这里最好的解决方法。或者,如消息所述,如果您的父级确实作为非静态内部类有意义,您将需要使用“外部”类的封闭实例。

发布一些代码将有助于消除这些原因之间的歧义,并提出解决问题的最佳方法。我还将能够提供具有正确类名的解决方案示例 - 目前我认为任意名称不会有太大帮助,因为听起来您还没有确定内部/外部类问题。

于 2010-07-29T16:22:51.223 回答
0

您需要在您的子类中添加可以创建超类的构造函数 super()。

于 2010-07-29T16:26:52.197 回答
0

A类{

 .
 .
 .


 class B{
      . . .     
 }

}

如果您想访问 B 类并且它不是静态内部类,您可以将代码编写为

AB objOfB = 新 A()。新 B();

于 2013-04-04T07:33:39.083 回答