1

次のことを理解していません。「shorthand」を使用して内部クラスのインスタンスを作成する場合、明示的なインスタンスを作成していなくても、外部クラスにアクセスするのは悪い考えですか?

たとえば、次のコードについて考えてみます。

class OuterClass
{
    int i;

    OuterClass() { i = 2; }

    class InnerClass
    {
        int get_parent_i() { return (OuterClass.this.i); }
    }
}

以下は、期待される結果(2)をコンパイルして返します。

OuterClass.InnerClass ic = new OuterClass().new InnerClass();

System.out.println(ic.get_parent_i());

私の混乱は、InnerClassオブジェクトをインスタンス化するためにOuterClassオブジェクトを明示的に作成しなかったという事実に起因していますが、オブジェクトは存在しているように見えます。誰かが何が起こっているのか教えてもらえますか?何らかの理由でファントムインスタンスにアクセスするか忘れる必要がある場合はどうすればよいですか?

どうもありがとう!

4

2 に答える 2

8

new OuterClass()インスタンスを明示的に作成しない場合はどうなると思いますか?:)

あなたはそれへの参照を明示的に保存しませんでしたが、それは別のことです。コンストラクターを呼び出すと、結果をどのように処理するかに関係なく、インスタンスが作成されます。内部クラスには外部クラスへの参照が組み込まれて$thisいるため、内部クラスを保持している限り、常に参照が保持されます。

内部クラスを使用することがこれまでに良いアイデアであるかどうかは、歴史的に論争の的となるトピックですが、その特定の使用法に特に問題はありません。

于 2012-05-14T22:15:01.347 に答える
-1

コードの最初のブロックは100%受け入れられ、正しいです。しかし、このパターンは、巨大な外部クラス(内部ファクトリなど)の内部メカニズムとしてよく使用されます。

コードの2番目のブロックに関して。両方(内部クラスと外部クラス)を公開する場合は、OuterClassのオブジェクトを作成する必要はありません。このようにして、OuterClassに触れることなく、InnerClassが残りのパッケージに表示されます。

ただし、例でこれを行うと、Outerclass(i)の一部を使用しているため、NullPointerExceptionが発生します。

また、持っていれば。

public class OuterClass
{
    static int i;

    static {
        i = 3;
    }

    OuterClass() { i = 2; }

    public class InnerClass
    {
        int get_parent_i() { return (OuterClass.this.i); }
    }
}

将来OuterClassを開始し、その値を2に変更しない限り、「i」は3に等しくなります。

私が助けてくれたことを願っています!

于 2012-05-14T22:29:27.703 に答える