カテゴリ: JavaSilver試験対策 更新日: 2026/03/24

Javaの参照型変数とインスタンスの挙動を徹底解説!初心者でも理解できる

031
Javaの参照型変数とインスタンスの挙動

先生と生徒の会話形式で理解しよう

生徒

「Javaの変数がどのインスタンスを指しているのかがよく分からないんです。どうやって確認すれば良いですか?」

先生

「良い質問ですね。Javaでは、参照型変数がどのインスタンスを参照しているかがプログラムの動作に大きく影響します。具体例で確認してみましょう!」

1. 参照型変数とは?

1. 参照型変数とは?
1. 参照型変数とは?

Javaの変数には、基本型と参照型の2種類があります。基本型は値そのものを保持しますが、参照型はオブジェクトのアドレス(参照)を保持します。以下のコードを見てください。


public class Product {
    public String name;
    public int price;

    public void display() {
        System.out.println(name + ", " + price);
    }
}

このクラスでは、商品の名前と価格を管理できます。参照型変数は、このクラスから生成されたインスタンスを指し示します。

2. インスタンスの生成と参照

2. インスタンスの生成と参照
2. インスタンスの生成と参照

次のコードでは、2つのインスタンスを生成し、それぞれ異なる値を設定しています。


public class Main {
    public static void main(String[] args) {
        Product product1 = new Product();
        Product product2 = new Product();

        product1.name = "Laptop";
        product1.price = 1500;

        product2.name = "Phone";
        product2.price = 800;

        product1 = product2; // product1がproduct2を参照するように変更
        product1.display();
    }
}

実行結果は次のようになります:


Phone, 800

この結果は、product1product2と同じインスタンスを参照するようになったためです。

3. 参照の仕組みを理解するポイント

3. 参照の仕組みを理解するポイント
3. 参照の仕組みを理解するポイント

Javaでは、以下の点を理解することが重要です:

  • 参照型変数は、インスタンスを直接持つのではなく、インスタンスへのリンクを持つ。
  • リンクが変更されると、元のリンク先へのアクセスはできなくなる(ガベージコレクションの対象になる)。
  • 複数の変数が同じインスタンスを参照することができる。

このような特性を意識することで、プログラムの動作を正確に把握できます。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. 練習問題

4. 練習問題
4. 練習問題

以下のコードを実行して、結果を予想してみましょう:


public class Test {
    public String text;

    public static void main(String[] args) {
        Test t1 = new Test();
        Test t2 = new Test();

        t1.text = "Hello";
        t2.text = "World";

        t1 = t2;
        System.out.println(t1.text);
    }
}

答えは「World」です。t1t2を参照するようになったため、t2.textの値が出力されます。

5. 参照の代入とインスタンスの共有

5. 参照の代入とインスタンスの共有
5. 参照の代入とインスタンスの共有

参照型変数の代入(a = b;)は、オブジェクトの中身をコピーしているのではなく、単に「指し示す先(アドレス)」をコピーしているだけです。そのため、複数の変数が一つのインスタンスを共有する状態が生まれます。

片方の変数を通じて中身を書き換えると、もう片方の変数の値も変わったように見えます。以下のコードでその挙動を確認しましょう。


public class ShareExample {
    public static void main(String[] args) {
        Product p1 = new Product();
        p1.name = "初期状態";
        
        Product p2 = p1; // 参照を共有(アドレスのコピー)
        p2.name = "書き換え後";
        
        System.out.println("p1の名前: " + p1.name);
    }
}

実行結果:


p1の名前: 書き換え後

このように、一つのインスタンスを複数のリモコン(変数)で操作しているような状態になるため、意図しない書き換えが起きないよう注意が必要です。

6. メソッド引数と参照の渡し方

6. メソッド引数と参照の渡し方
6. メソッド引数と参照の渡し方

メソッドの引数に参照型変数を渡すときも、参照(アドレス)がコピーされます。メソッド内でインスタンスのフィールドを変更すると、呼び出し元のオブジェクトにも影響が及びます。


public class MethodRefExample {
    public static void updateProduct(Product p) {
        p.price = 2000; // 引数で受け取ったインスタンスを操作
    }

    public static void main(String[] args) {
        Product myProduct = new Product();
        myProduct.price = 1000;
        
        updateProduct(myProduct); // 参照を渡す
        
        System.out.println("現在の価格: " + myProduct.price);
    }
}

実行結果:


現在の価格: 2000

メソッドに「値」そのものを渡しているのではなく、「どこにあるか」という情報を渡しているため、このような結果になります。これを理解しておくと、複雑なプログラムのデバッグが非常に楽になります。

7. nullリテラルと参照の切断

7. nullリテラルと参照の切断
7. nullリテラルと参照の切断

変数に null を代入すると、その変数はどのインスタンスも指し示していない状態になります。これは、インスタンスとの「リンクを切る」ことを意味します。


public class NullRefExample {
    public static void main(String[] args) {
        Product p = new Product();
        p.name = "Camera";
        
        p = null; // 参照を解除
        
        // 参照先がない状態でアクセスしようとするとエラーが発生
        // System.out.println(p.name); // NullPointerException
        
        if (p == null) {
            System.out.println("変数は何も参照していません。");
        }
    }
}

実行結果:


変数は何も参照していません。

リンクが切れたインスタンスは、どこからもアクセスできなくなり、最終的にJavaのメモリ管理の仕組みによって自動的に消去されます。変数の「寿命」と「参照の管理」を意識することが、Javaマスターへの第一歩です。

まとめ

まとめ
まとめ

この記事では、Javaの参照型変数とインスタンスの関係について詳しく解説しました。参照型変数がインスタンスをどのように参照し、プログラム内でどのように挙動するのかを理解することは、オブジェクト指向プログラミングの基礎です。参照の変更によって元のインスタンスがガベージコレクションの対象となる仕組みも重要なポイントです。

以下のサンプルプログラムを通して、参照型変数がどのようにインスタンスを扱うか、さらに理解を深めましょう。


public class Example {
    public String value;

    public static void main(String[] args) {
        Example ex1 = new Example();
        Example ex2 = new Example();

        ex1.value = "First Instance";
        ex2.value = "Second Instance";

        ex1 = ex2; // ex1がex2を参照するように変更
        System.out.println("ex1 value: " + ex1.value);
        System.out.println("ex2 value: " + ex2.value);
    }
}

実行結果は次の通りです:


ex1 value: Second Instance
ex2 value: Second Instance

この結果から、変数ex1ex2が同じインスタンスを参照していることが分かります。参照が変更されたことで、もともとex1が指していたインスタンスはどこからも参照されなくなり、ガベージコレクションの対象となります。

先生と生徒の振り返り会話

生徒

「参照型変数がどのインスタンスを指しているかを追うのが大事だと分かりました!参照が変わると、元のインスタンスが使われなくなるんですね。」

先生

「その通りです。この仕組みを理解すれば、不要なインスタンスを作らずに効率的なプログラムを書くことができますよ。」

生徒

「変数の参照先が切り替わるタイミングに注意して、練習してみます!」

先生

「良いですね。次は配列やコレクションでの参照型の挙動も学んでみましょう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaの参照型変数とは何ですか?基本型との違いを教えてください。

Javaの参照型変数は、インスタンス(オブジェクト)そのものではなく、そのインスタンスのアドレス(参照)を保持する変数です。一方、基本型変数は値そのものを直接保持します。

Javaで参照型変数がどのインスタンスを指しているかを確認する方法はありますか?

プログラムの出力やデバッグ機能を使って、参照型変数が参照しているインスタンスのフィールドの値を表示することで確認できます。

Javaのnewキーワードを使ったインスタンスの生成方法とは?

Javaでは、newキーワードを使ってクラスからインスタンスを生成します。これにより、そのクラスのコンストラクタが呼び出され、新しいオブジェクトがメモリ上に作成されます。

Javaで2つの変数が同じインスタンスを参照する場合、どのような影響がありますか?

同じインスタンスを参照する変数は、同じデータを共有するため、一方の変数を通じてデータを変更すると、もう一方の変数にも影響が及びます。
JavaSilver試験対策の一覧へ
新着記事
Java
Java の古い日付クラス(Date, Calendar)と新しい日付 API の違い
JavaのDateとCalendarと新しい日付APIの違いとは?初心者向け完全ガイド
Java
Java のカレンダー機能(java.util.Calendar)の使い方
JavaのCalendarクラスの使い方をわかりやすく解説!日付や時刻の操作に便利な基本機能まとめ
Flutter
Dartのパッケージ管理(pubspec.yaml)の使い方
FlutterとDartのパッケージ管理完全ガイド!pubspec.yamlの使い方を初心者向けに徹底解説
Java
Java のミリ秒(Unix タイムスタンプ)を取得・変換する方法
JavaでUnixタイムスタンプ(ミリ秒)を取得・変換する方法を徹底解説!
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク