変数スコープ
各変数は、宣言されたコンテクスト内でのみ利用可能であり、アクセス可能です。 コンテキストを決定するには、宣言を囲む最も近い開始マークと終了マークを参照してください。 ほとんどのプログラミング言語では、中括弧({}
)を使用して、コードブロックの先頭と末尾をマークします。 この例をチェックしてください: p>
ここでコードのすべてのビットを理解する必要はありません。 🙂コンテキスト内の変数の利用可能性について話すとき、私たちはスコープを参照しています。 ここでは、変数root
が紫色で囲まれた2つの中括弧の間で宣言されていることがわかります。 その変数のスコープは、これら2つの中括弧の間のすべてです。
変数のスコープは、変数が宣言されている場所に応じて、グローバルと同様にローカルにすることができます。 グローバル変数はプログラム内のすべてのクラスとメソッドで使用できますが、ローカル変数は宣言されているメソッド内でのみ使用できます。
ここでは、コードaを展開しました。少しと別のものを含むようにコードの私たちの最初のブロックを拡張! 紫色の線をトレースすると、最初のブロックの括弧が2番目のブロックのすべてのコードを包含していることがわかります。 次に、新しい変数spy
が緑色のローカルスコープ内で宣言されていることがわかります。
以来root
変数は、グローバルスコープで宣言されている、それはローカルスコープで宣言されたすべてを含む紫色の括弧内のすべてにアクセ コードの2番目のブロックでは、spy変数宣言のすぐ下にroot
を使用する行が表示されます。 それは許可されています!
ただし、ローカルスコープ内にあるものは、グローバルスコープまたは他のローカルコードブロックでは使用できません。 別の例を見てみましょう:
ここでは、独自のローカルスコープと独自の変数anotherSpy
。 さて、私たちのスパイ変数ブロックの最後の行をチェックしてください:
System.out.println(anotherSpy); // Error
エラーがあるように見えます! これは、anotherSpy
anotherSpy
anotherSpy
は、宣言されているコードブロックでのみ使用できます。
同じことが他の方向にも当てはまります。 最後のコードブロックの最後の行にもエラーがあることがわかります。
System.out.println(spy); // Error
ここでは、別のコードブロックの変数spyを使用しようとしています。 しかし、spy
は、それを使用しようとしているコードブロックと同じスコープにないため、できません。
クラス内の変数スコープ
クラスを宣言すると、スコープの同じ一般的なルールが適用されます。 Unicornクラスを試してみましょう。
最初の例と同様に、グローバルクラス変数とローカル変数があります。 詳細にレビューしてみましょう:変数height
power
はクラスのフィールドであり、クラス内の任意の場所にアクセスできます。
変数minutesToSleep
は、宣言されているコードブロックのローカルスコープ内でのみアクセスできます。
変数minutesToRun
は、宣言されているコードブロックのローカルスコープ内でのみアクセスできます。
変数のスコープは、定義によってアクセシビリティを制限します。 ただし、クラスフィールドはクラスの外部からアクセスでき、他のコードブロックで使用できます。この例では、それらはheight
power
です。 Unicorn変数を宣言すると、それらの値を読み取ったり変更したりすることができます。
クラス変数を混乱させることは深刻な結果を招く可能性があ 良いニュースは-あなたはそれを制御することができます! 方法を確認する前に、必ず可変スコープを使用して練習してください。
あなた自身のためにそれを試してみてください!
アクセス制御
クラス、モジュール、またはファイルへの制限されたアクセスを実装することによって、アクセス制御の考え方を使用します。 クラスとファイルが何であるかは、私たちがそれらと協力してきたので、あなたはすでに知っています!
モジュールは、フレームワークのように、名前に関連付けられた関連するソースファイルのバンドルです。 フレームワークは、特定のコンテキストによってグループ化された機能のセットです。 開発プロセスを高速化し、コードの記述方法に関するガイダンスを提供します。
すべての開発環境によって提供されるフレームワークの数があります。 実際には、これらのフレームワークの実装は、それらを使用する開発者が見て利用できるものをはるかに超えています。 これは、アクセス制御の実装とも呼ばれる実装の詳細へのアクセスを制限することによって行われます。
制御レベル
Javaでは、次のいずれかのキーワードを使用して制御レベルを指定する必要があります。
-
Public:世界に表示されるため、最も制限: 通常、それらが含まれているパッケージにのみ表示されます(デフォルト設定)
-
Private:それらが定義されているコンテキスト(それが配置されているクラス内)
これらの明確な制限を置くことは、開発をはるかに容易にします。 実装の不要な可視性や、不要な変更を心配する必要はありません。
関連する宣言の前に適切なキーワードを配置します。
次に、クラスの外部からプライベートメンバーにアクセスしようとすると、エラーが発生します:
制御レベルは、クラス要素だけでなく、クラスに割り当てることができます。
public class PublicClass {}private class PrivateClass {}
セキュリティに加えて、クラスメンバーの制御レベルを指定すると、読みやすさが向上します。 開発者がソースファイルの準備をしているとき、どの要素を外部で使用できるかは常に明確です。
コントロールの階層
要素は、それを含む要素と同じまたはより制限的な制御レベルを持つことができます。
上記の例では、クラスはpublic
と宣言されています。 クラスは包含要素であるため、これは、そのクラスのすべての要素が同じレベルまたはそれ以下のレベルの露出である可能性があることを意味し この場合、すべてのレベルが含まれます。
クラスをprivate
package-private
private
:
class PrivateClass { int internalProperty = 0; // automatically assigned package-private by default protected defaultProperty = true; // automatically assigned package-private public boolean publicProperty = true; // automatically converted to package-private private String fileprivateProperty = "Hello!"; //only available to the class private static void privateMethod() { }}
上記の例では、明示的なアクセス制御キーワード このシナリオでは、デフォルトでは、包含要素のレベルを想定しています。 この場合、それは私たちのクラスなので、PrivateClass
のレベルを前提としています。
トップレベルのクラスはprivateとマークすることはできませんが、デフォルトとして設定すると、パッケージで保護されたレベルになります。
クラスの変数を宣言するときに、宣言コンテキストの制御レベルがクラスの制御レベルよりも高い場合、変数には明示的な制御レベルも必要です。 FileprivateClass変数を宣言しましょう:ご覧のとおり、変数のコンテキストのデフォルトのアクセスレベルが割り当てているクラスよりも高い場合は、変数のレベルをクラスのレベルと同
Summary
この章では、変数のアクセシビリティについて学びました。
-
変数のスコープは、それが宣言されているコード領域です。
-
一般的な変数スコープは、クラスを含むすべてのコードブロックに適用されます。変数や関数へのアクセスを制御するために必要なもう1つの方法は、public、protected、package-protected、privateの制御レベルを使用することです。