1

出典: JavaWorld

ネストされたクラスでのみ使用できることを理解staticしています。これにより、それらはトップレベルクラスと同等になります。また、これにより、外側のクラスとは独立して宣言できることも理解しています。

  1. それが理論ですが、なぜこれを行う必要があるのか​​について、良い実用的な例を誰か思いつくことができますか? (リンクの例は、AFAIKの内部クラスの例である可能性があります)。

  2. また - 質問の背後にある理由 - なぜあいまいな名前を持っているのですか? なぜ単語を「再利用」しstaticて別の意味合いを与えるのですか?

4

5 に答える 5

4

クラスが自然にネストされている場合に使用しますが、内部クラスがJavaで持っているauto-magic$this親参照は必要ありません。すべての非静的内部クラスには、それを含むインスタンスへの埋め込み参照があります。実際にその参照が必要ない場合は、作成しないことをお勧めします。オブジェクトが必要以上に長くメモリに残る可能性があります。また、オブジェクトのシリアル化を開始したり、ネットワーク経由で送信しようとしたりするときにも苦痛になる可能性があります。最終的には、オブジェクトグラフが自分よりもはるかに大きくなる可能性があります。シリアル化することが期待または必要です!

Map.Entryの実装は良い例です。マップの実装でネストされるのは明らかに「自然」ですが、親参照をマップに実際に保持する必要はありません。

#2の場合、それはどのように異なりますか?フィールドまたはメソッドの静的とは、インスタンスではなくクラス定義の属性であることを意味します。インスタンスがなくてもアクセスして使用できます。ネストされたクラスで静的であるということは、それがクラス定義の属性であることも意味します。インスタンスがなくてもアクセスして使用できます。

于 2011-02-15T18:35:11.203 に答える
2
  1. トップレベルクラスの可視性は、パブリックまたはパッケージの場合があります。ただし、ネストされた静的クラスの可視性もプライベートまたは保護されている場合があります。ネストされたクラスを宣言すると、クラスのパッケージ化(構造化)とそれらの依存関係の関連付けも改善される可能性がありますMap.Entry。とはいえ、それはまた、移り気がないかもしれません。

  2. この単語staticは、インスタンスがクラスレベルで宣言されていることを意味します。たとえばstatic int i、クラスの整数を宣言します。トップレベルのクラスは、クラスレベルでクラスが同じであると宣言するのと同じです。

于 2011-02-15T18:43:07.520 に答える
1

staticこれらのコンテキスト全体の共通の意味は、 「コンパイル時に解決可能」です (オブジェクト インスタンスでそれらを検索して仮想メソッド テーブルを通過する必要があるのとは対照的に)。これは、静的メソッド、静的変数、および静的内部クラスに適用されます。これは、コンパイラの作成者が言語のキーワードを選択するときに起こることだと思います。概念的には、コンパイラの作成者はそれらをすべて「最適化できるもの」としてグループ化します。

于 2011-02-15T18:45:21.623 に答える
1
  1. それが理論です。なぜこれを行う必要があるのか​​について、良い実用的な例を思い付くことができる人はいますか? (リンクの例は、AFAIKの内部クラスの例である可能性があります)。

これを行うと、ガベージ コレクションが促進されます。非静的内部クラスには、外部クラスへの参照が含まれています。

例: Runnable をいくつかのタスク リストでキューに作成する大きな外部クラスがある場合、その Runnable の存在が、その Runnable の収集を妨げる唯一のものになる可能性があります。現在、内部クラスは JVM にヒープ領域の無駄なチャンクを保持するよう強制しています。これは、収集がはるかに困難な Eden から Survivor 領域に移動する必要がある可能性があります。

  1. また - 質問の背後にある理由 - なぜあいまいな名前を持っているのですか? なぜ静的という言葉を「再利用」して、別の意味合いを与えるのですか?

あなたはそれを何と呼びたいですか?言語に関しては、 static を使用しても文法が曖昧になることはありません。私にとって「静的」は理にかなっています。内部クラスのインスタンスは、外部クラスのインスタンスのメンバーではありません (またはその逆)。

于 2011-02-15T18:33:20.130 に答える
1

2 番目の質問にお答えします。

他のいくつかのキーワードは意味がオーバーロードされているため、このstatic例は一意ではありません。 static静的インポートのコンテキストでは、別の意味さえあります。たとえそれがまったく異なる意味を持っていたとしても、それが意味を成す可能性のある別の状況で、あなたがすでに知っている言葉を再利用することです.

たとえばfinal、一度だけ初期化できる変数を識別するために使用できます。オーバーライドできないメソッドを識別するなど、他の意味もあります。

superまた、synchronizedいくつかのコンテキストで使用されます。

于 2011-02-15T18:31:51.250 に答える