ホームページ >Java >&#&チュートリアル >Javaの変数とオブジェクトのスコープの詳細な説明(画像とテキスト)
この記事では主に Java 変数と オブジェクト のスコープに関する関連知識を紹介します。とても良い参考値なので、エディターで見てみましょう
ほとんどのプログラミング言語には「スコープ」という概念が用意されています。
スコープで定義された名前の場合、スコープはその「可視性」と「存在時間」の両方を決定します。 C、C++、および Java では、スコープは中括弧の位置によって決まります。
例:
{ int x = 12; /* only x available */ { int q = 96; /* both x & q available */ } /* only x available */ /* q “out of scope” */ }
Java は、スコープ内で定義された変数として、スコープと呼ばれる 1 組の中かっこを使用します。最後まで利用可能です。
Java では次のようなコードを書くことはできません:
{ int x = 12; { int x = 96; /* illegal */ } }
Java コンパイラーは変数が定義されていると判断するため、スコープ内の変数を繰り返し定義することはできませんが、C および C++ では変数を「非表示」にすることができます。 C および C++ では許可されている大きなスコープは、Java の設計者がプログラムを混乱させると考えているため、Java では許可されません。
さらに 2 つの例を見てみましょう。効果を皆さんに見てもらうために、ここではスクリーンショットを使用します。
①
② もう一度このコードを見てみましょう。 11 行目と 12 行目文法的に間違っていないもの は何ですか?コードは次のとおりです:
位置を交換すると、コードは次のようになります:
スコープを離れるとき、変数によって割り当てられたメモリ空間は JVM によって再利用されます。そのため、構文エラーは発生しません。また、最初の 2 つの名前の書き方は {} の範囲から外れないため、構文エラーが発生します。
上記の変数はすべてローカル変数ですが、グローバル変数がある場合はどうなるでしょうか?コードで話しましょう。コードは次のとおりです:コードを注意深く観察して考えると、変数のスコープについて次の結論を導き出すことができます:
同じスコープの下で、グローバル変数名
とローカル変数名は同じにすることができます。変数を使用する場合、使用するかどうかを指定しない場合、同じスコープ内でラップされたローカル変数と同じ変数名を持つことはできません。グローバル変数またはローカル変数の場合、デフォルトではローカル変数が使用されますが、ローカル変数が独自のスコープを超えると無効になり、JVM によってガベージ コレクションされます。その後、この変数の名前を変更して、最新に定義されたローカル変数を使用できます。変数。Java オブジェクトは、Zhu 型と同じ存在時間を持ちません。 new
キーワードを使用して Java オブジェクトを作成すると、そのオブジェクトはスコープ外になります。したがって、次のコードを使用すると:{ String s = new String("a string"); } /* 作用域的终点 */ハンドル s、つまり reference はスコープの最後で消えます。ただし、 s が指す String オブジェクトは依然としてメモリ空間を占有します。上記のコードでは、このオブジェクトを指す唯一のハンドルがスコープの境界を超えているため、このオブジェクトを使用し続ける方法はありません。
その結果、new で作成されたオブジェクトは、望む限り残ります。このプログラミング
の問題は、C と C++ で特に顕著です。 C++ では最大の問題が発生します。言語からの助けがないため、オブジェクトが必要なときに使用できるかどうかを判断する方法がありません。そして最も厄介なことは、C++ では作業が完了したらオブジェクトを手動でクリアする必要があることです。これは興味深い質問を引き起こします。 Java がオブジェクトを同じままにする場合、オブジェクトがメモリをいっぱいにして、最終的にプログラムが「フリーズ」することをどうすれば防ぐことができるでしょうか? C++ では、この問題はプログラマーにとって最大の悩みの種です。しかし、Java 以降は状況が変わりました。 Java には、new で作成されたすべてのオブジェクトを検索し、参照されなくなったオブジェクトを識別する特別な「ガベージ コレクター」があります。次に、これらのアイドル状態のオブジェクトが占有しているメモリを自動的に解放し、新しいオブジェクトが使用できるようにします。これは、メモリの再利用についてまったく心配する必要がないことを意味します。 オブジェクトを作成するだけで、不要になると自動的に削除されます。そうすることで、C++ でよくあるプログラミングの問題、つまりプログラマがメモリを解放し忘れることによって引き起こされる「メモリ オーバーフロー」を防ぐことができます。
以上がJavaの変数とオブジェクトのスコープの詳細な説明(画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。