-1

同じメソッドで宣言された匿名の内部クラス内でメソッドのローカル変数を使用できない理由が知りたいです。内部クラスへの参照が存在し続ける可能性がある一方で、メソッドの完了後に変数がコールスタックから削除される理由は、私には正当化されないようです。

私の疑問:

  1. メソッドの外でクラスをインスタンス化できない場合、ローカル変数を使用させない理由は何でしょうか?

  2. 議論を最終的なものにすることで、それが受け入れられるのはなぜですか? これらもコールスタックにありませんか?

  3. 内部クラスはメソッドの外部でインスタンス化できないため、内部クラスへの参照を別のメソッドに渡す方法と、別のメソッドの参照変数に割り当てる方法を教えてください。代入できる変数の型は何ですか?

次に例を示します。

public class MyOuter2 {

    int num = 1;                    //Outer instance variable

    void doStuff(final int x) {     //Outer instance Method with final variable

//      void doStuff( int x) {      //Final removed,  compiler error


        class MyInner {                 //Outer Method inner class

            public void seeOuter() {
                System.out.println("Outer num=" + num);
                System.out.println(x);
            }

        }

        MyInner inner = new MyInner();
        inner.seeOuter();
        readInnerObject(inner);             //any method that pass inner object

    }




    public void readInnerObject(Object i ){

        MyOuter2 outer = new MyOuter2();    // how to receive it???????????

        }

    public static void main(String args[]) {

        MyOuter2 o = new MyOuter2();
        o.doStuff(2);
    }

}
4

2 に答える 2

1

内部クラスのコードは、外側のメソッドが終了した後に実行でき、ローカル変数はコール スタックに存在しなくなります。したがって、それらの値のコピーを作成する必要があります。内部クラスがインスタンス化されているときにこれを行うと、理解と実装が最も簡単になります。

メソッドの外でクラスをインスタンス化できない場合、ローカル変数を使用させない理由は何でしょうか?

内部クラスのコードが実行されると、コール スタックにローカル変数が存在しなくなる可能性があるためです。

引数を最終的にすると、それが受け入れられるのはなぜですか? これらはスタックと一緒に行きませんか?

そのような値は、いつコピーされるかを気にせずにコピーできるためです。

内部クラスをメソッドの外部でインスタンス化できない場合、内部クラスの参照が他のメソッドに渡された場合、どのタイプの変数に割り当てられるのでしょうか?

内部クラスは、内部クラスが拡張または実装するスーパークラスまたはインターフェースによって参照できます。

于 2013-06-24T21:04:50.723 に答える
0

質問 3 に答えるには、他のメソッドに のインスタンスを渡すことはできません。なぜなら、他のメソッドはクラスがMyInner何であるかを認識していないからです。MyInnerより現実的な例でMyInnerは、インターフェイスを実装するか、スーパークラスを拡張します。MyInnerこれにより、インターフェイスまたはスーパークラスの型として宣言された参照変数に割り当てることにより、他のメソッドにのインスタンスを渡すことができます。

于 2013-06-24T21:28:21.213 に答える