1

Javaは、その定義で現在のクラスのインスタンスの使用を許可していますか?

例:

public class Component
{
    Component()
    {
       // some code 
    }

    public void method()
    {
        Component comp=new Component();
        // some code
    }
 }

コンパイル時エラーが発生しないことはわかっています。ただし、自己参照は少し混乱します。それは、Javaのセマンティクスがクラスの循環定義を可能にすることを意味しますか?

4

3 に答える 3

2

私はあなたがこのようなことについて考えたと思います...これを実行すると

スレッド「メイン」の例外java.lang.StackOverflowError

public class AClass {

    private AClass aClass;

    public AClass() {
        this.aClass = new AClass();
        this.aClass.printHello();
    }

    private void printHello() {
        System.out.println("Hello");
    }

    public static void main(final String[] args) {
        new AClass();
    }
}

このような再帰的なコードは必要ありません。しかし、いくつかのユースケースがあると思います。エンドレスループとStackOverflowErrorを防ぐために、中止基準を設定することが重要です。

あなたの質問に答えるために、私はJavaがcylicインスタンス化を許可すると言うでしょう。

于 2013-03-16T00:58:15.383 に答える
0

定義クラスで同じタイプのインスタンスを使用/作成することは完全に合法であり、循環定義は追加されません。

コンパイラーは通常、クラスのすべてのメソッドを調べる最初のパスを実行します。実際のメソッド実装コードの生成は、コンパイラーがすべてのクラスで使用可能なすべてのメソッドを認識した後で行われます。

于 2013-03-16T00:45:21.983 に答える
0

循環的な定義ではありません。

循環定義とは、2つ以上のクラスが循環的に相互に参照する場合です。しかし、それでもコンパイルされますが、実行の問題が発生する可能性があります。

それはむしろ「先に使用する」定義であり、これは私がそれを呼ぶ方法です。

クラスを定義し、そのメソッドで同じクラスへの参照を使用します。

これは少し矛盾しています。クラスを使用する前に、クラスを完全に定義する必要があります。クラスのメソッドは、その定義の一部です。メソッドの場合と同様に、クラスがすでに定義されているかのようにクラスインスタンスを参照します。

紛らわしいことに同意しますが、Javaではこれを実行できます。

シングルトンについて考えてみてください。

多くの場合、クラスインスタンスを返す静的メソッドがあります。同じ問題。

于 2013-03-16T01:22:45.050 に答える