スコープとライフタイム
変数を参照できる範囲(スコープ)と存在する期間(ライフタイム)を理解します。ブロック、ループ、メソッド、フィールド、シャドーイング、finalパラメータを扱います。
「スコープとライフタイム」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全3レッスンが含まれています。
スコープとライフタイム
スコープは、名前(変数)を参照できる場所です。ライフタイムは、変数が存在する期間です。ブロックスコープ、ループスコープ、メソッド内のローカル変数、クラスフィールド、シャドーイングの規則を確認します。
ブロックスコープ
ブロックスコープ:中括弧の内側で宣言した変数は、その中括弧の内側でのみ参照できます。
public class Main {
public static void main(String[] args) {
int a = 10; // visible in main
{
int b = 20; // visible only inside this block
System.out.println("inside block: a=" + a + ", b=" + b);
}
System.out.println("outside block: a=" + a);
// System.out.println(b); // would NOT compile: b is out of scope
}
}
ループスコープ
ループスコープ:for ヘッダーで宣言したループインデックスは、ループ本体の内側でのみ参照できます。
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 3; i = i + 1) {
System.out.println("i in loop = " + i);
}
// System.out.println(i); // would NOT compile: i is scoped to the loop
int j;
for (j = 0; j < 2; j = j + 1) {
System.out.println("j in loop = " + j);
}
System.out.println("j after loop = " + j); // OK: j declared outside
}
}
フィールドとローカル変数
ライフタイム:クラスフィールドや static フィールドは呼び出しをまたいで存続します。ローカル変数は呼び出しごとに作成され、メソッドが終了すると破棄されます。
public class Main {
// static field (class-level): lives for the program lifetime
static int counter = 0;
static void tick() {
int local = 100; // local: created each call, dies when method returns
counter = counter + 1;
System.out.println("tick: counter=" + counter + ", local=" + local);
}
public static void main(String[] args) {
tick();
tick();
tick();
System.out.println("final counter=" + counter);
}
}
シャドーイング
シャドーイング:内側の宣言(例:パラメーターやローカル変数)によって、同じ識別子を持つ外側の名前が隠されることがあります。隠れたフィールドにアクセスするには、ClassName.field(インスタンスメソッドでは this.field)を使います。
public class Main {
static String label = "FIELD"; // class field
static void demo(String label) { // parameter shadows field name
System.out.println("param label = " + label); // uses parameter
{
String labelInner = "INNER"; // new name in inner block
System.out.println("inner block labelInner = " + labelInner);
System.out.println("still param label = " + label);
}
System.out.println("field via class name = " + Main.label); // refer to field explicitly
}
public static void main(String[] args) {
demo("PARAM");
}
}
final と値渡し
final パラメーターは再代入できません。Java は値渡しです。パラメーターを再代入しても、呼び出し側の変数は変わりません。
public class Main {
// final parameter cannot be reassigned inside the method
static int inc(final int n) {
// n = n + 1; // would NOT compile if uncommented
return n + 1; // safe: return a new value
}
static void reassign(int x) {
x = 999; // reassignes the local copy; caller variable is unchanged
}
public static void main(String[] args) {
int a = 5;
int b = inc(a);
System.out.println("a=" + a + ", b=inc(a)=" + b);
reassign(a);
System.out.println("after reassign(a): a is still " + a);
}
}
スコープとライフタイムの確認
クイックチェック:スコープとライフタイムについて正しい説明はどれですか。
復習と次のステップ
復習:ブロックスコープとループスコープ、フィールドとローカル変数、シャドーイング、final パラメーターを練習しました。次は A2.2 で設計と再利用のパターンに進みます。
よくある質問
「スコープとライフタイム」レッスンは無料ですか?
はい。「スコープとライフタイム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全3レッスンが含まれています。
「スコープとライフタイム」で何を学びますか?
変数を参照できる範囲(スコープ)と存在する期間(ライフタイム)を理解します。ブロック、ループ、メソッド、フィールド、シャドーイング、finalパラメータを扱います。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「スコープとライフタイム」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- メソッドとパラメータの定義
- 戻り値とオーバーロード
- スコープとライフタイム