「教授はマンネリから抜け出せない。講義に慣れた年老いた教師はいつもこんな感じだ。本で見つけられない教授の教えは何一つない。聞いて泳ぎ方を学ぶことはできない」 「水泳の講義まで。講義は、その主題に精通していて、教授とほぼ同じくらいの知識がある場合にのみ役に立ちます。」
「それでも、彼の教訓は役に立ちます。」
「そうです。つまり、そうであることを願っています。その主題についてより多くの視点を聞けば聞くほど、真実に近づくことができます。たった一つの話を聞いたとき、できることはそれを信じるか信じないかだけです。OK、しましょうビジネスに戻りなさい。」
「前に見せた写真を見てみましょう。」
┏
┃public class Variables
┃┏
┃┃{
┃┃ private static String TEXT = "The end.";
┃┃ ┗━━━━━━━━━━━━━━━━━━━┛
┃┃ public static void main (String[] args)
┃┃ ┏ ┗━━━━━━━┛
┃┃ ┃ {
┃┃ ┃ System.out.println("Hi");
┃┃ ┃ String s = "Hi!";
┃┃ ┃ ┏┗━━━━┛
┃┃ ┃ ┃ System.out.println(s);
┃┃ ┃ ┃ if (args != NULL)
┃┃ ┃ ┃ {
┃┃ ┃ ┃ String s2 = s;
┃┃ ┃ ┃ ┗━━━━┛
┃┃ ┃ ┃ ┏
┃┃ ┃ ┃ ┃ System.out.println(s2);
┃┃ ┃ ┃ ┗
┃┃ ┃ ┃ }
┃┃ ┃ ┃ Variables variables = new Variables();
┃┃ ┃ ┃ System.out.println(variables.instanceVariable);
┃┃ ┃ ┃ System.out.println(TEXT);
┃┃ ┃ ┗
┃┃ ┃ }
┃┃ ┗
┃┃ public String instanceVariable;
┃┃ ┗━━━━━━━━━━━━━━━┛
┃┃ public Variables()
┃┃ {
┃┃ instanceVariable = "Instance variable test.";
┃┃ }
┃┃}
┃┗
┗
1. メソッド内で宣言された変数は、宣言の開始からメソッドの終了まで存在します (表示されます)。
2. コードブロック内で宣言された変数は、コードブロックの終わりまで存在します。
3. メソッドのパラメータは、メソッドが戻るまで存在します。
4. オブジェクト内の変数は、それを含むオブジェクトの存続期間全体にわたって存在します。それらの可視性は、特別なアクセス修飾子によっても制御されます。
5. 静的 (クラス) 変数は、プログラムの実行中ずっと存在します。それらの可視性はアクセス修飾子によっても定義されます。」
「そうです。この写真を覚えています。」
「わかりました。重要なポイントをいくつか思い出させてください。」
「メソッド内で宣言されたすべての変数は、宣言された時点からメソッドの終了まで存在します (表示されます) (例 1)。」
「変数がコード ブロック内で宣言されている場合、その変数はコード ブロックの終わりまで存在します (例 2)。」
「変数がメソッドのパラメータである場合、その変数はメソッドの本体全体に存在します (表示されます) (例 3)。」
「変数がインスタンス変数の場合 (例 4)、変数は特定のオブジェクトにリンクされ、そのオブジェクトが存在する限り存在します。オブジェクトが存在しない場合、変数のインスタンスは存在しません。変数にアクセスできます (つまり 、変数は、その前に宣言されたか後に宣言されたかに関係なく、クラスのすべてのメソッドから参照できます。新しい変数はオブジェクトごとに作成されます。他のオブジェクトから独立しています。静的メソッドからインスタンス変数にアクセスすることはでき ませ ん。」
「変数が静的として宣言されている場合、つまり、キーワードstaticでマークされている場合、その変数はそのクラスが存在する限り存在します。通常、JVM は最初の使用時にクラスをメモリにロードします。静的変数が初期化されるのもこの時です。」
「上の例では、Cat クラスを宣言しています。このクラスには、a、b、s (非静的変数)、および count (静的変数) という 4 つの変数があります。このクラスのオブジェクトを複数 (たとえば 3 つ) 作成すると、それぞれこれらには、クラスの非静的変数の独自のインスタンスが含まれます。 静的変数は、クラスのすべてのオブジェクトによって共有されます。技術的に言えば、Cat オブジェクトが作成される前から存在していたので、静的変数はこれらのオブジェクトの内部にさえありません。
「変数を static として宣言すると、次のようになりますs
。」
「わかりました。分かったと思います。」
「同じ名前の変数を宣言できますか?」
「メソッド内ではありません。メソッド内で宣言されたすべての変数には一意の名前が必要です。メソッドの引数もローカル変数とみなされます。」
「メンバー変数はどうなるのでしょうか?」
「メンバー変数もクラスごとに一意である必要があります。」
"ただし、例外があります。ローカル変数とメンバー変数の名前は同じであっても構いません。 "
「そのような変数を変更すると、同じ名前の 2 つの変数のうちどちらが変更されますか?」
「コード内に複数の可視 (アクセス可能な) 変数 (インスタンス変数とローカル変数など) がある場合、ローカル変数がアクセスされます。」
class Main
{
public int count = 0; // Declare an instance variable
public void run()
{
count = 15; // Access the instance variable
int count = 10; // Declare a local method variable
count++; // Access the method variable
}
}
「このコードは 2 つのカウント変数を宣言しています。3 行目はインスタンス変数、8 行目はローカル変数を宣言しています。」
「run メソッドが実行されると何が起こるかは次のとおりです。」
「7 行目で、インスタンス変数にアクセスし、値 15 をそれに割り当てます。」
「8 行目で、新しいローカル変数を宣言 (作成) します。count
これにより、インスタンス変数がマスクされます。ローカル変数は、メソッド内の後続のすべてのコードが参照 (アクセス) するものです。」
"とった。"
「ローカル変数はインスタンス変数をマスクします。つまり、アクセスされるのはローカル変数です。ただし、インスタンス変数にもアクセスできます。アクセスするのが少し複雑なだけです。」
静的 (クラス) 変数
|
非静的 (インスタンス) 変数
|
「静的メソッドと静的変数について他に何か教えてください。」
「静的メソッドと変数は、クラスのオブジェクトにリンクされません。それらはクラス自体にリンクされます。10 個のVariablesオブジェクトを作成すると (このレベルの最初の例を参照)、10 個のinstanceVariable変数 (それぞれに 1 つ)が作成されます。オブジェクト) と 1 つの共有 (静的) 変数TEXTのみです。」
"質問があります。"
「静的メソッドと非静的メソッドの違いは何ですか?」
「非静的メソッドがどのように機能するかを見てみましょう。」
コードはどのようになるか
|
本当に何が起こるのか
|
「 <object> dot <method name>を使用してメソッドを呼び出すと、実際にはクラス メソッドを呼び出し、その同じオブジェクトを最初の引数として渡します。メソッド内では、オブジェクトは'this'と呼ばれます。メソッドはこのオブジェクトとそのデータに対して実行されます。」
「わあ!そういうことか!」
「これが静的メソッドの仕組みです。」
コードはどのようになるか
|
本当に何が起こるのか
|
「静的メソッドを呼び出すと、オブジェクトは渡されません。つまり、'this'はnullに等しいのです。そのため、静的メソッドは非静的変数やメソッドにアクセスできません (渡す' this'がないため)これらのメソッドに)。
「うーん。わかる気がする。少しくらいは」
「そして、ディエゴおじさんがやって来ます...そして彼の任務です。」
GO TO FULL VERSION