在Java中使用extends会导致封闭实例错误

在Java中使用extends会导致封闭实例错误,java,abstract,extends,Java,Abstract,Extends,我试图在Java中使用扩展(继承)。我制作了一个快速的抽象类来扩展它,然后扩展了它。然而,我的IDE现在说“需要一个包含抽象类的封闭实例”,并给我的派生类构造函数提供了很大的错误行。到底是怎么回事?抽象类没有或不需要任何类型的构造函数 仅供参考,我使用extends而不是implements,部分原因是我不想为每个相同的派生类维护的实现细节都涉及对这个类使用反射 编辑:我已经阅读了一些回复。以上帝的名义,什么是静态(或者说非静态)类?只是为了激怒你们所有人,这并没有解决问题 // some_cl

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

仅供参考,我使用extends而不是implements,部分原因是我不想为每个相同的派生类维护的实现细节都涉及对这个类使用反射

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

// 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++的头文件是坏的。

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

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

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


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

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

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

interface MyInterface
{

   abstract class MyAbstractClass {
     // ...
   }
}
然后你试着

class ConcreteClass extends MyAbstractClass {

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

如果你有

interface MyInterface
{

   abstract class MyAbstractClass {
     // ...
   }
}
然后你试着

class ConcreteClass extends MyAbstractClass {

}

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

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

出于好奇,Java有两种类型的内部类:
static
和regular or(
non-static
)。如果没有为内部类定义包含
static
关键字,则表示该类的实例将始终需要父类的实例。例如:

public class MyClassOuter {
    //...
    public class MyClassInner {
        //..
    }
}
如果您这样写,可以理解的是,
MyClassInner
的任何实例都会隐式引用
MyClassOuter的实例。


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

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

出于好奇,Java有两种类型的内部类:
static
和regular or(
non-static
)。如果没有为内部类定义包含
static
关键字,则表示该类的实例将始终需要父类的实例。例如:

public class MyClassOuter {
    //...
    public class MyClassInner {
        //..
    }
}
如果您这样写,可以理解的是,
MyClassInner
的任何实例都会隐式引用
MyClassOuter的实例。

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

类a{

 .
 .
 .


 class B{
      . . .     
 }
}

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

A.B objOfB=新的A()。新B()

A类{

 .
 .
 .


 class B{
      . . .     
 }
}

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


A.B objOfB=新的A()。新B()

不要在其他课程内上课!(然而:)在其他类中没有类!(然而:)