1

これは私の Book.java コードです

public class Book {
    private int pageNumber;

    private class BookReader{
        public int getPage(){
            return pageNumber;
        }
    }
}

準拠して使用するとjavap、2つのクラスで次のことがわかりました

為にBook$BookReader.class

これは出力コードです

Compiled from "Book.jav
class Book$BookReader {
  final Book this$0;
  public int getPage();
}

私の質問は、ここで参照を行うときにfinalが追加される理由と、この参照が作成された理由です。内部クラスでの使用は何ですか?

為にBook.class

$ javap Book.class
Compiled from "Book.java"
public class Book {
  public Book();
  static int access$000(Book);
}

変数に static が追加された理由と、ここで Book がパラメーターとして渡された理由は?

できれば簡単な言葉で説明してください!

4

3 に答える 3

1

ではBookReaderfinal変数はを含むインスタンスthis$0への参照を保持します。これは、インスタンスの作成時にインスタンスごとにその作成方法によって決定され、その後は変更できないためです。BookReaderBookfinalBookReader

classBookでは、 static メソッドaccess$000は class の利益のための合成アクセサー メソッドですBook.BookReader。の内部クラスとしてBook、それぞれBookReaderが含まれるインスタンスのメンバー変数にアクセスできますが、Java ランタイムはこれを実際には認識せず、クラス ファイル形式にはそれに対する特別な表現はありません。

したがって、 memberBookReaderにアクセスできるようにするために、コンパイラは classでその目的のために合成のデフォルト アクセス メソッドを生成し、そのメソッドに関して外部クラスの変数へのアクセスを書き込みます。privateBook.pageNumberBookBookReader

于 2015-03-17T13:48:26.633 に答える
0

次のように定義BookReaderします。

class Book {
    private class BookReader {  }
}

このクラスは、作成されるインスタンスに依存するBookため、コンパイラは参照を作成し、最終的なものにします (これは、各Bookインスタンスが作成できる最適化ですBookReader) 。

次のように定義した場合BookReader:

class Book {
    private static class BookReader {  }
}

その場合、Book リーダーは Book のインスタンスなしで作成できるため、参照は存在しません。

ここを参照してください。

于 2015-03-17T13:41:18.600 に答える
0

非静的内部クラスには、その親インスタンスへの参照があります。それは

final Book this$0;

親の Book インスタンスへの参照は、実行時に変更できないため、最終的なものです。つまり、 BookReader には、構築時に割り当てられ、後で変更できない正確な Book への参照があります。

この線:

static int access$000(Book);

パッケージ レベルの静的アクセサー メソッドです。内部クラスが外部のプライベート メンバーにアクセスできるようにするために使用されます。

于 2015-03-17T13:40:13.257 に答える