プリミティブ型と参照型
Java におけるプリミティブ型と参照型の根本的な違いを理解します。
「プリミティブ型と参照型」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
プリミティブ型と参照型
Javaのデータ型には、基本的にプリミティブ型と参照型の2つのカテゴリがあります。この違いを理解することは、正しく効率的なJavaコードを書くうえで重要です。
8種類のプリミティブ型
Javaには、次の8種類のプリミティブ型があります。
byte(8ビット整数)short(16ビット整数)int(32ビット整数)long(64ビット整数)float(32ビット小数)double(64ビット小数)char(16ビットUnicode文字)boolean(true/false)
プリミティブ型は値をメモリ上に直接保持するため、オブジェクトのオーバーヘッドがありません。
int age = 25;
double price = 19.99;
boolean active = true;
char grade = 'A';
long population = 8_000_000_000L;
System.out.println(age); // 25
System.out.println(price); // 19.99
System.out.println(active); // true参照型
参照型は、ヒープ上のオブジェクトを指すメモリアドレス(参照)を保持します。次のようなものが含まれます。
- クラス(例:
String、Scanner) - 配列(例:
int[]) - インターフェース
- 列挙型とレコード
変数がオブジェクト自体を保持するのではなく、オブジェクトへのポインターを保持します。
String name = "Alice"; // reference to a String object
int[] scores = {90, 85, 92}; // reference to an array object
// name holds a reference, not the characters directly
System.out.println(name.length()); // 5
System.out.println(scores.length); // 3スタックとヒープのメモリ
プリミティブ型の変数はスタックに格納されます。スタックはメソッド呼び出しに関連付けられた、高速で短期間だけ使われるメモリです。
参照型のオブジェクトはヒープに置かれます。ヒープはより大きく、ガベージコレクションによって管理される長期間利用されるメモリです。参照(アドレス)自体はスタック上にあります。
// Stack: holds the int value directly
int x = 42;
// Stack: holds reference; Heap: holds the Person object
class Person {
String name;
int age;
}
Person p = new Person(); // p is a reference on stack, object on heap
p.name = "Bob";
p.age = 30;null:存在しない参照
参照型の変数にはnullを代入できます。これは、どのオブジェクトも指していないことを意味します。プリミティブ型はnullにできず、必ず値を持ちます。
null参照にアクセスすると、NullPointerException(NPE)が発生します。これはJavaで最もよくある実行時エラーの1つです。
String s = null;
// int n = null; // Compile error — primitives can't be null
try {
System.out.println(s.length()); // NullPointerException!
} catch (NullPointerException e) {
System.out.println("Caught NPE: reference was null");
}コピーの意味:プリミティブ型
プリミティブ型の変数を別の変数に代入すると、Javaは値をコピーします。一方を変更してももう一方には影響せず、それぞれ完全に独立しています。
int a = 10;
int b = a; // b gets a copy of the value 10
b = 20; // changing b does NOT affect a
System.out.println(a); // 10
System.out.println(b); // 20コピーの意味:参照型
参照型の変数を別の変数に代入すると、両方の変数が同じオブジェクトを指します。一方の参照を通じてオブジェクトを変更すると、その変更はもう一方の参照からも確認できます。
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1; // arr2 points to the SAME array
arr2[0] = 99; // modifies the shared array
System.out.println(arr1[0]); // 99 — arr1 sees the change too!
System.out.println(arr2[0]); // 99ラッパークラス:プリミティブ型のボクシング
各プリミティブ型には、java.langに対応するラッパークラスがあります。
int→Integerdouble→Doubleboolean→Booleanchar→Character
ラッパークラスを使うと、プリミティブ型をオブジェクトとして扱えます。これはList<Integer>などのコレクションで必要になります。
Integer boxed = Integer.valueOf(42); // explicit boxing
int unboxed = boxed.intValue(); // explicit unboxing
// Autoboxing / auto-unboxing (Java does this automatically)
Integer auto = 100; // autoboxed
int val = auto; // auto-unboxed
System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Double.MIN_VALUE); // 5.0E-324オートボクシングの注意点
オートボクシングは便利ですが、微妙なバグの原因になることがあります。Integerは-128から127までの値をキャッシュするため、その範囲外では==が値ではなく参照を比較します。
ラッパーオブジェクトを比較するときは、必ず.equals()を使用してください。
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true (cached)
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false (different objects!)
System.out.println(c.equals(d)); // true (correct comparison)メソッドへの引き渡し:値渡し
Javaは常に値渡しです。プリミティブ型では値がコピーされます。参照型では参照(アドレス)がコピーされるため、両方が同じオブジェクトを指します。ただし、メソッドの内部から呼び出し元の変数を再代入することはできません。
static void doubleValue(int n) {
n = n * 2; // only modifies the local copy
}
static void clearArray(int[] arr) {
arr[0] = 0; // modifies the shared object
}
int x = 5;
doubleValue(x);
System.out.println(x); // still 5
int[] nums = {10, 20, 30};
clearArray(nums);
System.out.println(nums[0]); // 0 — object was mutated実用的なまとめ表
プリミティブ型と参照型を比較したクイックリファレンスです。
- 格納場所:プリミティブ型 → スタック上の値、参照型 → スタック上のアドレス + ヒープ上のオブジェクト
- デフォルト値:プリミティブ型 → 0/false/\u0000、参照型 → null
- nullにできるか:プリミティブ型 → いいえ、参照型 → はい
- 代入時にコピーされるもの:プリミティブ型 → 値、参照型 → アドレス
- コレクション内での扱い:プリミティブ型にはラッパークラスが必要
クイックチェック
次のコードを実行すると何が起こりますか?
Integer x = 200; Integer y = 200; System.out.println(x == y);
まとめ:プリミティブ型と参照型
このレッスンの重要なポイント:
- Javaには8種類のプリミティブ型があり、値はスタックに直接格納されます
- 参照型はヒープ上のオブジェクトのアドレスを格納し、変数はそのアドレスを保持します
- プリミティブ型は値によってコピーされ、参照型はアドレスによってコピーされます
- 参照型の変数はnullにできますが、プリミティブ型はnullにできません
- ラッパークラス(Integer、Doubleなど)は、プリミティブ型をオブジェクトとしてボックス化します
- Javaは常に値渡しです。参照を渡す場合も同じです
よくある質問
「プリミティブ型と参照型」レッスンは無料ですか?
はい。「プリミティブ型と参照型」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「プリミティブ型と参照型」で何を学びますか?
Java におけるプリミティブ型と参照型の根本的な違いを理解します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「プリミティブ型と参照型」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- プリミティブ型と参照型
- 拡大変換と縮小変換
- instanceof 演算子
- 型キャストの実践