Java入門|クラス型変数の応用とオブジェクトの受け渡し

オブジェクトは渡して動かせ!悟空の「受け渡し」で理解するクラス型変数の応用

これまでで、クラス型の変数は「オブジェクトそのもの」ではなく、「オブジェクトを指し示す存在」であることを学びました。
ここからはさらに一歩進んで、その参照をどのように活用していくのかを見ていきます。

ドラゴンボールの世界で考えてみましょう。
悟空やベジータは、それぞれ独立した戦士ですが、「その戦士を指す情報」を他の場所に渡すことができます。つまり、悟空という存在を「別の戦士に紹介する」ようなイメージです。

このように、クラス型の変数は「受け渡し」ができるため、柔軟なプログラムを作ることができるのです。

オブジェクトが消えるときのしくみ(finalize)

まずはオブジェクトの終わりについて少し触れておきます。

オブジェクトが作られるときはコンストラクタが呼び出されましたが、
オブジェクトが不要になったときには finalize というメソッドが呼び出されることがあります。

ただし重要なポイントがあります。

  • finalize が呼ばれるタイミングは制御できない
  • Javaが自動的に判断する

ドラゴンボールでたとえると、

「戦士が戦場から消えるタイミングは神様が決める」

ようなものです。

そのため、現在の実務では finalize に頼る設計はあまり推奨されません。

クラス型の変数はフィールドとしても使える

クラス型の変数は、メソッドだけでなく「フィールド」としても使えます。

ドラゴンボールで考えると、

  • 戦士が「名前」を持つ
  • その名前も実はオブジェクト(文字列)

という関係になります。

フィールドの種類内容
基本型power, energy
クラス型name(名前)

つまり、

戦士の中に別のオブジェクト(名前)が入る

という構造になります。

クラス型を引数として渡す

ここが今回の一番重要なポイントです。

クラス型の変数は、メソッドの引数として渡すことができます。

つまり、

オブジェクトそのものではなく
その参照(場所情報)を渡す

ということです。

サンプルプログラム

ファイル名:Sample8.java

class Saiyan
{
    private int power;
    private double energy;
    private String name;

    public Saiyan()
    {
        power = 0;
        energy = 0.0;
        name = "名無しの戦士";
        System.out.println("戦士を生成しました。");
    }

    public void setSaiyan(int p, double e)
    {
        power = p;
        energy = e;
        System.out.println("戦闘力を" + power + "、気力を" + energy + "に設定しました。");
    }

    public void setName(String nm)
    {
        name = nm;
        System.out.println("名前を" + name + "にしました。");
    }

    public void show()
    {
        System.out.println("戦闘力は" + power + "です。");
        System.out.println("気力は" + energy + "です。");
        System.out.println("名前は" + name + "です。");
    }
}

class Sample8
{
    public static void main(String[] args)
    {
        Saiyan goku;
        goku = new Saiyan();

        goku.show();

        int power = 9000;
        double energy = 5000.0;
        String warriorName = "孫悟空";

        goku.setSaiyan(power, energy);
        goku.setName(warriorName);

        goku.show();
    }
}

引数で何が起きているのか

ここで重要なのはこの部分です。

String warriorName = "孫悟空";
goku.setName(warriorName);

このとき起きていることはこうです。

項目内容
実引数warriorName(孫悟空)
仮引数nm
処理nmに参照が渡される

つまり、

「名前オブジェクトへの参照」がメソッドに渡される

ということになります。

なぜクラス型の引数が重要なのか

この仕組みを使うことで、次のようなことが可能になります。

  • オブジェクトをそのまま別の処理に渡せる
  • 同じデータを複数の場所で共有できる
  • 柔軟で再利用しやすい設計ができる

ドラゴンボールでいうと、

  • 悟空の情報を仲間に共有する
  • 同じ悟空を複数の場面で使う

というイメージです。

重要ポイント

  • クラス型の変数はフィールドにも使える
  • クラス型はメソッドの引数として渡せる
  • 渡されるのはオブジェクトそのものではなく参照
  • 同じオブジェクトを複数の場所で扱える

この「参照を渡す」という考え方は、Javaの設計において非常に重要です。
ここを理解すると、オブジェクト同士の連携や設計力が一気にレベルアップします。