私はこの質問は今、ほぼ3歳ですが、私は問題の一部がまだ回答されていないことを見つける知っている:
そして:それはクラスBはもはやプライベートであることを意味していないん実行時に? skaffmans答えに
カルロスHeubergersコメントは、クラスB
はまだパッケージ内の他のクラスのprivate
で、示唆しています。
彼はおそらくJavaプログラミング言語に適しています。つまり、他のクラスのクラスB
を参照することはできません。少なくともリフレクションを使用していない場合(プライベートクラスのメンバーも外部からアクセスできる)、これは別の問題です。
しかし、JVMは内部クラス(skaffman状態)の概念を持たないため、バイトコードレベルで「1つのクラスだけがアクセス可能」な可視性がどのように実現されているのか自分自身に尋ねました。答え:JVMの場合、内部クラスは通常のパッケージのプライベートクラスのように見えますが、それはまったく実現しません。これは、自分でバイトコードを書く(またはコンパイラによって生成されたコードを変更する)場合、問題なくクラスB
にアクセスできます。
同じパッケージ内のすべてのクラスからすべての合成アクセサメソッドにアクセスできます。したがって、クラスB
のメソッドのクラスA
のプライベートフィールドに値を割り当てると、値を設定するクラスA
(access$000
という名前)で、デフォルト(つまりパッケージプライベート)の可視性を持つ合成アクセサメソッドが生成されます。このメソッドは、クラスB
から呼び出されることになっています(実際には、Java言語を使用して呼び出すことができます)。しかし、JVMの観点から見ると、これは他のクラスと同様のメソッドであり、どのクラスでも呼び出すことができます。
だから、質問に答えるために:ビューのJavaの言語の観点から
- を、クラス
B
であり、民間のままです。
- JVMの観点からは、クラス
B
(またはそれ以上:クラスA$B
)はプライベートではありません。
OK、わかりました。私の場合、これは例のような内部クラスの使用を避けることを意味し、混乱の原因となるだけです。 – Gerard
私はそれがあなたを気にさせません。そのコンパイラの警告は、誰にもあまり使われていないので、合成メソッドは常に内部クラスで使用されており、大きな影響はありません。 – skaffman
IMHO合成方法は、言語への不必要な追加でした。 "プライベート"メンバ(コンパイラがとにかくフードの下で行う)のパッケージスコープを使用するだけで満足のいく解決策でした。 – finnw