Java道|クラスからオブジェクトを使う流れ

設計図を作り、実体を生み出し、値を入れて使う。クラスとオブジェクトがつながるとJavaが動き出す

クラスを学ぶと、Javaでは情報や機能をひとまとまりにできることが分かってきます。

ただ、クラスを宣言しただけでは、まだプログラムの中で実際に動く存在は生まれていません。鬼滅の刃風にたとえるなら、「鬼殺隊士とは、名前や階級を持ち、呼吸を使って戦う存在である」という設計図を作っただけの状態です。

その設計図から実際の隊士を作り、名前や体力を設定し、画面に表示する。ここまでつながって、はじめてクラスを使ったプログラムとして動き出します。

この記事では、クラスを宣言し、オブジェクトを作り、フィールドに値を入れ、表示するまでの流れを、鬼滅の刃風の世界観で整理していきます。具体的なサンプルプログラムは Sample1.java を使い、クラスとオブジェクトの基本的な使い方を確認します。

クラスを利用するとはどういうことか

クラスを学び始めると、まず class の書き方に注目しがちです。もちろんクラスを宣言することは大切です。

しかし、クラスは書いて終わりではありません。クラスは、そこからオブジェクトを作って利用してこそ意味を持ちます。

Javaでクラスを利用する流れは、次のようになります。

手順内容
1クラスを宣言する
2クラスからオブジェクトを作成する
3オブジェクトのメンバにアクセスする
4値を表示したり使ったりする

鬼滅の刃風にたとえると、次のような流れです。

手順鬼滅の刃風のイメージ
1鬼殺隊士の設計図を作る
2その設計図から水月という隊士を作る
3水月の name や stamina に値を入れる
4水月の情報を画面に表示する

つまり、クラスは設計図、オブジェクトは実体、メンバアクセスは実体の情報に触れる操作です。

この流れがつながると、クラスはただの知識ではなく、実際に使える部品として見えてきます。

↓クリックすると拡大表示されます。

設計図と実体を1本の流れで見る

クラスとオブジェクトは、別々に覚えるよりも、1本の流れとして見ると理解しやすくなります。

たとえば DemonSlayer クラスを作るとします。

このクラスには、鬼殺隊士に共通する情報として name や stamina を持たせます。

ただし、この段階ではまだ具体的な隊士はいません。
name という名前欄、stamina という体力欄を用意しただけです。

そこから mizuki というオブジェクトを作ると、今度はその mizuki に対して、具体的な値を入れられるようになります。

考え方内容
クラスどんな情報を持つかを決める
オブジェクトその情報に実際の値を持つ
メンバアクセスオブジェクトの中の情報に触れる

鬼滅の刃風に言えば、鬼殺隊士クラスは隊士登録用の設計図です。
mizuki オブジェクトは、その設計図から作られた実際の隊士です。
mizuki.name や mizuki.stamina は、その隊士の名前欄や体力欄に触れている状態です。

実際に動くプログラムで確認する

ここでは、クラスの宣言、オブジェクトの作成、フィールドへの値の代入、表示までをまとめたプログラムを見ていきます。

ファイル名:Sample1.java

class DemonSlayer
{
    String name;
    int stamina;
}

class Sample1
{
    public static void main(String[] args)
    {
        DemonSlayer mizuki;
        mizuki = new DemonSlayer();

        mizuki.name = "水月";
        mizuki.stamina = 100;

        System.out.println("隊士の名前は" + mizuki.name + "です。");
        System.out.println("体力は" + mizuki.stamina + "です。");
    }
}

このプログラムには、クラスを使う基本の流れがまとまっています。

DemonSlayer クラスで設計図を作ります。
main メソッドの中で mizuki という変数を用意します。
new DemonSlayer() でオブジェクトを作ります。
mizuki.name と mizuki.stamina に値を入れます。
最後に、その値を画面に表示します。

プログラムの前半では設計図を作っている

最初に書かれているのは DemonSlayer クラスです。

class DemonSlayer
{
    String name;
    int stamina;
}

ここでは、鬼殺隊士が持つ情報として name と stamina を定義しています。

フィールド意味
name隊士の名前
stamina体力

この段階では、まだ水月という隊士は作られていません。

あくまで、「鬼殺隊士なら名前と体力を持つ」という設計図を作っている状態です。

name や stamina は、まだ具体的な値ではありません。
これから作るオブジェクトが持つ情報の種類を表しています。

main メソッドから処理が始まる

次に Sample1 クラスがあります。

class Sample1
{
    public static void main(String[] args)
    {
        ...
    }
}

Javaのプログラムは、main メソッドから実行が始まります。

このファイルには DemonSlayer クラスと Sample1 クラスの2つがありますが、最初に動くのは main メソッドを持つ Sample1 クラスです。

DemonSlayer クラスは設計図として使われます。
Sample1 クラスは、実際に処理を進める入口になります。

このように、1つのファイルの中に複数のクラスがあっても、どこから処理が始まるのかを意識すると読みやすくなります。

オブジェクトを作成している部分

main メソッドの中では、まず次の2行があります。

DemonSlayer mizuki;
mizuki = new DemonSlayer();

この2行は、オブジェクト作成の基本です。

1行目では、DemonSlayer 型の変数 mizuki を宣言しています。

DemonSlayer mizuki;

これは、DemonSlayer オブジェクトを扱うための変数を用意している状態です。

2行目では、新しい DemonSlayer オブジェクトを作り、それを mizuki に代入しています。

mizuki = new DemonSlayer();

鬼滅の刃風にたとえると、次のような流れです。

コードイメージ
DemonSlayer mizuki;水月という隊士を扱うための札を用意する
mizuki = new DemonSlayer();鬼殺隊士の設計図から実体を作り、mizuki で扱えるようにする

ここで大切なのは、mizuki が DemonSlayer オブジェクトを参照する変数だということです。

フィールドに具体的な値を入れている部分

次に、フィールドへ値を代入しています。

mizuki.name = "水月";
mizuki.stamina = 100;

ここでは、mizuki が参照しているオブジェクトの name と stamina に具体的な値を入れています。

アクセス入る値
mizuki.name水月
mizuki.stamina100

この処理によって、ただの DemonSlayer オブジェクトだったものが、「名前は水月、体力は100の隊士」として具体的な状態を持ちます。

ここで使っている mizuki.name や mizuki.stamina のような書き方が、メンバアクセスです。

変数名.フィールド名 の形で、参照しているオブジェクトの中にあるフィールドへアクセスしています。

表示している部分を見る

最後に、設定した値を画面に表示しています。

System.out.println("隊士の名前は" + mizuki.name + "です。");
System.out.println("体力は" + mizuki.stamina + "です。");

ここでは、mizuki.name と mizuki.stamina に入っている値を取り出して表示しています。

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

隊士の名前は水月です。
体力は100です。

この表示によって、オブジェクトに入れた値が正しく使われていることが分かります。

ここまで来ると、クラス、オブジェクト、フィールド、メンバアクセス、表示が1本の流れとしてつながります。

このプログラムで押さえたいポイント

このプログラムには、クラス利用の基本が入っています。

ポイント内容
クラス宣言DemonSlayer クラスで設計図を作る
オブジェクト作成new DemonSlayer() で実体を作る
変数mizuki がそのオブジェクトを参照する
メンバアクセスmizuki.name や mizuki.stamina で情報に触れる
表示設定した値を画面に出す

この表を見ながらコードを読むと、1行ごとの役割が整理しやすくなります。

図:クラスからオブジェクトを使う流れ

↓クリックすると拡大表示されます。

この図が示していること

この図は、クラスを宣言してから、オブジェクトを作り、フィールドに値を入れて表示するまでの流れを示しています。

左側の DemonSlayer クラスは設計図です。
new DemonSlayer() によって、その設計図から実体が作られます。
mizuki オブジェクトには name や stamina の具体的な値が入ります。
最後に、その値を画面へ表示します。

この図から分かることは、クラス、オブジェクト、メンバアクセス、表示は別々の知識ではなく、1つの流れとしてつながっているということです。

オブジェクトは1つだけでなく複数作れる

Sample1.java では、オブジェクトを1つだけ作っています。

DemonSlayer mizuki;
mizuki = new DemonSlayer();

ただし、同じクラスからオブジェクトはいくつでも作成できます。

たとえば、水月だけでなく雷斗も作りたい場合は、考え方として次のようになります。

DemonSlayer mizuki;
mizuki = new DemonSlayer();
mizuki.name = "水月";
mizuki.stamina = 100;

DemonSlayer raito;
raito = new DemonSlayer();
raito.name = "雷斗";
raito.stamina = 85;

このようにすると、同じ DemonSlayer クラスから作られた2つのオブジェクトが、それぞれ別の値を持てます。

変数namestamina
mizuki水月100
raito雷斗85

クラスは1つでも、作られるオブジェクトは複数にできます。

鬼滅の刃風に言えば、鬼殺隊士という設計図は1つでも、そこから水月、雷斗、風牙のような複数の隊士を作れるということです。

ただし、この記事で具体的に扱うサンプルプログラムは Sample1.java のみです。複数オブジェクトの話は、クラスの利用がどのように広がるかを理解するためのイメージとして押さえておくと十分です。

コンパイルするとクラスファイルが複数できる

Sample1.java には、2つのクラスが書かれています。

ソースファイル内のクラス役割
DemonSlayer鬼殺隊士の設計図
Sample1main メソッドを持つ実行用クラス

そのため、コンパイルすると対応するクラスファイルも2つ作られます。

ソースファイル内のクラス作成されるクラスファイル
DemonSlayerDemonSlayer.class
Sample1Sample1.class

Sample1.java をコンパイルしたときに class ファイルが2つできても、不思議ではありません。

Javaでは、ソースファイルの中に書かれているクラスごとに class ファイルが作られます。

実行するときの見方

プログラムを実行するときは、main メソッドを持つ Sample1 クラスを実行します。

DemonSlayer クラスは、オブジェクトを作るための設計図です。
Sample1 クラスは、実際に処理を始める入口です。

この違いを整理すると、次のようになります。

クラス役割
DemonSlayerオブジェクトの設計図
Sample1プログラムの開始地点

実行時には Sample1 の main メソッドが動きます。
その中で DemonSlayer オブジェクトを作り、値を入れて表示しています。

クラスを作る人と利用する人が分かれることもある

クラスの便利なところは、設計図を作る人と、それを利用する人が分かれても使えることです。

たとえば、次のように役割を分けられます。

役割内容
クラスを作る人DemonSlayer クラスを設計する
クラスを使う人DemonSlayer からオブジェクトを作り、表示や管理を行う

鬼滅の刃風にたとえるなら、鬼殺隊士の登録用紙を設計する人と、その登録用紙を使って隊士管理をする人が分かれているようなものです。

クラスが分かりやすく設計されていれば、別の人でもそのクラスを使ってプログラムを書きやすくなります。

つまりクラスは、自分だけが使うものではなく、他の処理からも利用できる部品として作れるところに価値があります。

図:Sample1.java の役割分担

↓クリックすると拡大表示されます。

この図が示していること

この図は、Sample1.java の中に DemonSlayer クラスと Sample1 クラスがあることを示しています。

DemonSlayer クラスは、鬼殺隊士の設計図です。
Sample1 クラスは、main メソッドを持つ実行用のクラスです。

また、コンパイルすると DemonSlayer.class と Sample1.class が作られることも示しています。

この図から分かることは、1つのソースファイルに複数のクラスが書かれている場合、クラスごとに class ファイルが作られるということです。

オブジェクト指向の入口として大事なこと

クラスやオブジェクトをもとにプログラムを組み立てる考え方は、オブジェクト指向と呼ばれます。

最初は難しく感じるかもしれませんが、入門段階では次の流れを押さえれば大丈夫です。

流れ内容
クラスで設計図を作るどんな情報を持つかを決める
オブジェクトで実体を作るnew で具体的な存在を作る
メンバにアクセスするフィールドへ値を入れる
値を使う画面に表示する

鬼滅の刃風に言えば、

鬼殺隊士という型を作る
水月という実体を生み出す
水月の名前と体力を設定する
その情報を表示する

という流れです。

この感覚がつかめると、これから学ぶメソッド、コンストラクタ、継承、ポリモーフィズムも、「設計図と実体」という土台の上にあることが見えやすくなります。