Javaの参照型とは?変数にオブジェクトそのものではなく場所が入る考え方

本記事は、Schooの「Java入門 初級【2026年版】」第5回「クラスとオブジェクト」を学ぶ前後に、Javaの参照型の考え方を整理したい方向けのステップアップ学習記事です。
ただし、Schooを受講していない方でも、クラスとオブジェクトを学び始めた段階で読み進められる内容にしています。
Schoo コースページ:Java入門 初級【2026年版】
参照型は、変数にオブジェクトそのものが入るのではなく、オブジェクトを指す情報が入る型です。クラスから作ったオブジェクトを変数で扱うとき、この考え方が重要になります。
変数にはオブジェクトそのものが入るわけではない
次のコードでは、new Student("山田", 80) によって Student オブジェクトが作られます。変数 s1 は、そのオブジェクトを指すための変数です。
ファイル名: ReferenceBasicExample.java
public class ReferenceBasicExample {
public static void main(String[] args) {
Student s1 = new Student("山田", 80);
System.out.println(s1.name + ":" + s1.score + "点");
}
}
class Student {
String name;
int score;
Student(String name, int score) {
this.name = name;
this.score = score;
}
}
s1 という変数の中に、名前や点数のデータがそのまま詰め込まれている、と考えると後で混乱しやすくなります。実際には、s1 は Student オブジェクトを指す情報を持っています。
s1 と s2 は別々の変数ですが、矢印の先が同じなら同じ Student オブジェクトを見ています。s2 = s1 はオブジェクトのコピーではない
参照型で特につまずきやすいのが、変数同士の代入です。次の例では、s2 = s1; と書いています。
Student s1 = new Student("山田", 80);
Student s2 = s1;
s2.score = 90;
System.out.println(s1.score);
System.out.println(s2.score);
s2 = s1; は、Student オブジェクトをもう1つ複製する処理ではありません。s2 も s1 と同じオブジェクトを指すようになります。
そのため、s2.score = 90; と書くと、s2 が指しているオブジェクトの score が変わります。s1 も同じオブジェクトを指しているため、s1.score も 90 と表示されます。
参照の動きを確認する
このツールでは、「s2 = s1; と書くとオブジェクトがコピーされるのか、それとも同じオブジェクトを見るのか」を確認します。注目するのは、s2.score = 90; のあとに s1.score も 90 として見える理由です。
選択中のプログラム
見るポイント:s1 と s2 が同じオブジェクトを指していると、s2 から変更した値を s1 からも見ることになります。
どのオブジェクトを見ているか
実際に値が入っている場所
1つ目のStudentオブジェクト
name = ““
score =
2つ目のStudentオブジェクト
name = ““
score =
別々にnewすれば別のオブジェクトになる
同じ値を持つオブジェクトでも、別々に new すれば別のオブジェクトです。
Student s1 = new Student("山田", 80);
Student s3 = new Student("山田", 80);
この場合、s1 と s3 は同じ名前と点数を持っていても、別々のオブジェクトを指します。値が同じことと、同じオブジェクトであることは別の話です。
確認問題
Student s1 = new Student("山田", 80);と書いたとき、s1には何が入っていると考えるとよいですか。Student s2 = s1;と書くと、Studentオブジェクトは複製されますか。s2 = s1;のあとにs2.score = 90;とした場合、s1.scoreはどうなりますか。
演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。
あわせて読みたい関連記事
まとめ
参照型の変数には、オブジェクトそのものではなく、オブジェクトを指す情報が入ると考えると整理しやすくなります。変数を代入したときに同じオブジェクトを指すのか、別々に new して別のオブジェクトを作っているのかを意識しましょう。