0

Javaでextends(継承)を使おうとしています。拡張するための簡単な抽象クラスを作成し、それを拡張しました。しかし、私の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

あなたが投稿したコードは私にとってはうまくコンパイルされているようです。IDEでクリーンビルドを実行してみてください。動作するはずです。

好奇心のために、Javaには2種類の内部クラスがあります。static通常または(non-static)です。内部クラス定義のキーワードを含めないstatic場合、そのクラスのインスタンスには常に親クラスのインスタンスが必要になることを意味します。例:

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

MyClassInnerこれを書くと、のインスタンスは、のインスタンスへの暗黙の参照を持つことが理解されます。MyClassOuter.

Static一方、そのようなことはありません。これは、たまたま別のクラス定義内にあるクラス定義にすぎません。外側のクラスは、ほとんどパッケージのように使用されます(完全ではありませんが)。

于 2010-07-29T18:10:14.057 に答える
2

あなたが持っている場合

interface MyInterface
{

   abstract class MyAbstractClass {
     // ...
   }
}

そして、あなたは試します

class ConcreteClass extends MyAbstractClass {

}

説明されているエラーが表示されます。修正は、MyAbstractClass を最上位クラスに移動することです (独自のファイルに配置します。非公開クラスには厳密には必要ありませんが、コードを整理します)。または、static修飾子を MyAbstractClass 宣言に追加します。

于 2010-07-29T16:29:08.513 に答える
0

スーパークラスを作成できるコンストラクター super() を子クラスに追加する必要があります。

于 2010-07-29T16:26:52.197 に答える
0

「インスタンスを囲んでいます」というメッセージは、スーパークラスに (静的ではない) 内部クラスがあることをほぼ確実に示しています。ほとんどの場合、内部クラスは静的にすることができ、静的にする必要があります。これがおそらく最善の回避策です。または、メッセージが示すように、親が非静的内部クラスとして本当に意味がある場合は、「外部」クラスの囲みインスタンスを使用する必要があります。

コードを投稿すると、これらの原因を明確にし、解決する最善の方法を提案するのに役立ちます。また、適切なクラス名で解決策の例を示すこともできます-現在、内部/外部クラスの問題を特定していないように聞こえるため、任意の名前がそれほど役立つとは思いません。

于 2010-07-29T16:22:51.223 に答える