Javaの値渡し
Javaの値渡しを理解します。プリミティブ型と参照、再代入とミューテーション、配列、不変性に関する落とし穴を学びます。
「Javaの値渡し」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全3レッスンが含まれています。
値渡しの概要
目標:Java がパラメーターを渡す方法を学びます。プリミティブ型と参照、再代入と変更、配列、不変性を比較します。
プリミティブ型のコピー
プリミティブ型は値渡しされるため、呼び出されたメソッドはコピーを受け取ります。パラメーターを再代入しても、呼び出し側の変数は変わりません。
public class Main {
static void inc(int x) {
x = x + 1; // modifies the local copy only
}
public static void main(String[] args) {
int a = 5;
inc(a);
System.out.println("a after inc(a) = " + a); // still 5
}
}
参照:変更と再代入
オブジェクトの場合、参照がコピーされます。その参照を通じてオブジェクトを変更すると呼び出し側のオブジェクトにも影響しますが、パラメーターを再代入しても影響しません。
public class Main {
static class Box { int n; }
static void setTo999(Box b) { b.n = 999; } // mutate via copied reference
static void reassign(Box b) { b = new Box(); b.n = 123; } // reassign local copy only
public static void main(String[] args) {
Box bx = new Box();
bx.n = 10;
setTo999(bx);
System.out.println("after setTo999: bx.n = " + bx.n); // 999
reassign(bx);
System.out.println("after reassign: bx.n = " + bx.n); // still 999
}
}
配列:変更と再代入
配列はオブジェクトです。配列を変更すると呼び出し側にも影響しますが、パラメーターを再代入しても呼び出し側の配列は置き換わりません。
public class Main {
static void fillZero(int[] a) {
for (int i = 0; i < a.length; i = i + 1) a[i] = 0; // mutate caller array
}
static void replace(int[] a) {
a = new int[] {9, 9, 9}; // reassign local copy of the reference
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
fillZero(arr);
System.out.println("after fillZero: " + arr[0] + "," + arr[1] + "," + arr[2]); // 0,0,0
replace(arr);
System.out.println("after replace: " + arr[0] + "," + arr[1] + "," + arr[2]); // still 0,0,0
}
}
不変と可変
String は不変で、新しいオブジェクトを返します。StringBuilder は可変で、同じインスタンスを変更します。
public class Main {
static void tryChangeString(String s) {
s = s + "!"; // new String; original unchanged
}
static void changeBuilder(StringBuilder sb) {
sb.append("!"); // mutates same object
}
public static void main(String[] args) {
String s = "hi";
tryChangeString(s);
System.out.println("after tryChangeString: " + s); // "hi"
StringBuilder sb = new StringBuilder("hi");
changeBuilder(sb);
System.out.println("after changeBuilder: " + sb.toString()); // "hi!"
}
}
正しく入れ替える
パラメーターはコピーであるため、メソッド内でプリミティブ型を入れ替えても呼び出し側には影響しません。新しい値(または値を保持するオブジェクト)を返します。
public class Main {
static void trySwap(int a, int b) {
int t = a; a = b; b = t; // swaps local copies only
}
static int[] swap(int a, int b) {
return new int[] { b, a }; // return results to the caller
}
public static void main(String[] args) {
int x = 1, y = 2;
trySwap(x, y);
System.out.println("after trySwap: x=" + x + ", y=" + y); // 1,2
int[] res = swap(x, y);
x = res[0]; y = res[1];
System.out.println("after swap: x=" + x + ", y=" + y); // 2,1
}
}
値渡しの確認
クイックチェック:Java のパラメーター渡しについて正しい説明はどれですか。
復習と次のステップ
復習:プリミティブ型と参照、変更と再代入、オブジェクトとしての配列、不変性、安全な入れ替えのパターンを確認しました。次は static メソッドとインスタンスメソッドです。
よくある質問
「Javaの値渡し」レッスンは無料ですか?
はい。「Javaの値渡し」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全3レッスンが含まれています。
「Javaの値渡し」で何を学びますか?
Javaの値渡しを理解します。プリミティブ型と参照、再代入とミューテーション、配列、不変性に関する落とし穴を学びます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「Javaの値渡し」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。