Java超|オブジェクト指向とクラスの基本

クラスが分かると、Javaのコードは「処理の並び」から「キャラクターを生み出す設計図」に変わる。

Javaを学び始めると、最初は変数、配列、条件分岐、繰り返しなどを使って、上から順番に処理を書くことが多いです。
小さなプログラムであれば、それでも十分に動かせます。

しかし、プログラムで扱う内容が増えてくると、ただ処理を並べるだけでは分かりにくくなります。

たとえば、ドラゴンボール風の世界で考えてみましょう。

悟空、ベジータ、悟飯、ピッコロ、クリリン、天津飯、ヤムチャ、トランクスのような戦士を管理するプログラムを作るとします。
戦士には、名前があります。所属する流派があります。戦闘力があります。体力もあります。さらに、攻撃する、移動する、気を高める、状態を表示するといった動きもあります。

ここで使う流派は、次のように整理します。

記号流派名
亀仙流
鶴仙流
武泰斗流
カリン流
ピッコロ魔族流
神流、ナメック流
惑星戦士流
北の界王流

これらをバラバラの変数や処理として書いていくと、戦士が増えたときにコードがどんどん複雑になります。

そこで登場するのが クラス です。

クラスは、関連する情報と動きをひとまとまりにするためのしくみです。
Javaでは、このクラスがとても重要です。Javaのプログラムは基本的にクラスを土台にして作られるため、クラスの考え方を理解すると、コードが一気に見やすくなります。

ドラゴンボール風にたとえるなら、クラスは 悟空やベジータのような戦士を作るための設計図 です。

戦士にはどんな情報が必要なのか。
戦士はどんな動きができるのか。
それらをまとめて定義するものがクラスです。

ここでは、Javaのオブジェクト指向の入口として、クラス、フィールド、メソッド、メンバ、クラス宣言の基本を、戦士の設計図としてイメージしながら整理していきます。

クラスは情報と動きをまとめるための設計図

Javaのクラスをひとことで表すと、あるものについての情報と動きをまとめた設計図 です。

ドラゴンボール風に考えると、いきなり悟空だけを考えるのではありません。
まずは「戦士という存在には、どんな情報があり、どんな動きがあるのか」を整理します。

戦士には、たとえば次のような情報があります。

項目
名前悟空、ベジータ、悟飯、ピッコロ、クリリン
流派亀仙流、鶴仙流、ピッコロ魔族流、北の界王流
流派記号亀、鶴、魔、界
戦闘力どれくらい強いか
体力戦える残りの力
装備道着、戦闘服、マント、補助スカウター

また、情報だけでなく、次のような動きもあります。

動き
自己紹介する自分の名前や流派を名乗る
攻撃する流派に応じた技で攻撃する
移動する戦場を高速移動する
気を高める戦闘力を上げる
状態を表示する名前、流派、戦闘力、体力を表示する

このように、そのものが持っている情報と、そのものができる動きをひとつにまとめるのがクラスです。

クラスを使うと、ばらばらの変数や処理をそのまま並べるのではなく、次のように整理できます。

考え方内容
これは戦士に関する情報名前、流派、戦闘力、体力など
これは戦士に関する動き攻撃する、移動する、気を高める、状態を表示するなど
だから戦士クラスにまとめる情報と動きを1つの設計図にする

つまりクラスは、プログラムの中で扱うものを分かりやすく分類するための考え方でもあります。

Javaではクラスが土台になる

Javaでは、プログラムを書くときにクラスが欠かせません。

たとえば、Javaの基本的なコードは次のような形になります。

public class Main {
    public static void main(String[] args) {
        System.out.println("Javaを学習中です");
    }
}

この中の次の部分がクラスです。

public class Main

Javaを学び始めたばかりのころは、Mainクラスを「とりあえず必要な外枠」と感じるかもしれません。

しかし、クラスをきちんと理解すると、この外枠にはもっと大切な意味があることが分かります。

クラスは、単なるコードの入れ物ではありません。
意味のある情報と処理をまとめる部品です。

ドラゴンボール風に言えば、クラスは 悟空、ベジータ、悟飯たちを登録して動かすための型 です。

たとえば、これまでは処理の流れを順番に書くことが中心だったかもしれません。
しかしクラスを意識すると、次のような見方ができるようになります。

見方内容
どんな情報を持たせるか名前、流派、流派記号、戦闘力、体力など
どんな機能を持たせるか攻撃する、移動する、気を高める、状態を表示するなど
どのまとまりで管理するか戦士クラス、敵クラス、修行場クラスなど

この視点が、Javaのオブジェクト指向の入口です。

クラスとは何かをドラゴンボール風で考える

ドラゴンボール風の世界には、さまざまな戦士がいます。

悟空のように亀仙流で鍛えた戦士。
クリリンのように亀仙流の基礎を身につけた戦士。
天津飯のように鶴仙流の技を使う戦士。
ピッコロのようにピッコロ魔族流やナメック系の力を持つ戦士。
ベジータのように惑星戦士流の戦い方を持つ戦士。
悟空が北の界王のもとで修行したように、北の界王流の技を扱う戦士。

それぞれ個性は違いますが、共通して持っていそうな要素があります。

共通する要素内容
名前があるどの戦士なのかを表す
流派があるどの戦い方を身につけているかを表す
流派記号がある亀、鶴、武、塔、魔、神、惑、界などで流派を表す
戦闘力がある強さを数値で表す
体力があるどれくらい戦えるかを表す
攻撃できる戦士として戦う動き
状態を表示できる自分の情報を確認する動き

こうした共通する情報と機能を整理して作る設計図がクラスです。

戦士クラスのイメージは、次のようになります。

class Warrior {
    name
    styleMark
    styleName
    power

    setName()
    attack()
    showStatus()
}

これは、実際に動かすための厳密なJavaコードというより、クラスの考え方をつかむためのイメージです。

この中には、戦士に関する情報と動きがまとまっています。

name、styleMark、styleName、powerは、戦士が持っている情報です。
setName、attack、showStatusは、戦士ができる動きです。

このように、状態や性質と、それに関係する機能をひとつにまとめるのがクラスの役目です。

図:クラスは戦士の設計図

この図が示していること

この図は、クラスが情報と動きをまとめる設計図であることを示しています。

左側の情報は、戦士が持っている状態です。
名前、流派記号、流派名、戦闘力、体力のように、その戦士がどんな存在なのかを表します。

右側の動きは、戦士ができる行動です。
攻撃する、移動する、気を高める、状態を表示するというように、実際の処理を表します。

中央の設計図から小さな戦士アイコンが生まれていることで、クラスは具体的な戦士を作るための土台だと分かります。

フィールドはそのものが持っている情報

クラスの中に書かれる情報の部分を、Javaでは フィールド と呼びます。

フィールドは、そのものが持っている状態や性質を表します。

ドラゴンボール風に言えば、フィールドは 悟空やベジータたちのプロフィール欄 です。

たとえば、Warriorクラスなら、次のようなフィールドが考えられます。

フィールド表している内容
name戦士の名前
styleMark流派を表す記号
styleName流派の正式名称
power戦闘力
stamina現在の体力
equipment装備

戦士のフィールドのイメージは、次のようになります。

class Warrior {
    name
    styleMark
    styleName
    power
    stamina
    equipment
}

この6つはすべて、戦士の情報です。

ここにはまだ、攻撃する、移動する、気を高める、状態を表示するといった動きは書かれていません。
あくまで、戦士が持っている情報を保存する場所です。

フィールドを理解するときは、その戦士の今の状態を覚えておくための欄 と考えると分かりやすいです。

たとえば、悟空なら次のような情報を持っているイメージです。

項目内容
名前悟空
流派記号
流派名亀仙流
戦闘力9000
体力100
装備道着

ベジータなら、次のように別の情報を持たせられます。

項目内容
名前ベジータ
流派記号
流派名惑星戦士流
戦闘力9500
体力100
装備戦闘服

この情報をクラスの中で持たせるための場所がフィールドです。

Java風に近づけると、次のように書けます。

class Warrior {
    String name;
    String styleMark;
    String styleName;
    int power;
    int stamina;
    String equipment;
}

この中の次の部分がフィールドです。

String name;
String styleMark;
String styleName;
int power;
int stamina;
String equipment;

フィールドがあることで、1人の戦士に関する情報をひとまとまりとして扱えるようになります。

流派をフィールドとして持たせる意味

今回の戦士クラスでは、流派をとても大切な情報として扱います。

なぜなら、流派によって、その戦士の雰囲気や攻撃方法が変わるからです。

流派記号流派名例にするキャラクター戦士のイメージ
亀仙流悟空、クリリン、ヤムチャ基礎を大切にし、体術と気の扱いのバランスがよい
鶴仙流天津飯、餃子鋭く素早い技を得意とする
武泰斗流亀仙人、鶴仙人古き武術の型を重んじる
カリン流悟空、ヤジロベー修行による成長や身軽さを重視する
ピッコロ魔族流ピッコロ特殊な技や威圧感のある戦い方をする
神流、ナメック流神様、デンデ、ピッコロ神秘的で精神性の高い技を扱う
惑星戦士流ベジータ、ナッパ、ラディッツ異星由来の荒々しい戦闘スタイルを持つ
北の界王流悟空気の制御や高次の修行を重視する

このように、流派は単なる文字ではありません。
戦士の個性を表す重要な情報です。

そのため、クラスの中ではstyleMarkやstyleNameのようなフィールドとして持たせると、戦士の特徴を整理しやすくなります。

メソッドはそのものができる動き

クラスの中に書かれる機能の部分を、Javaでは メソッド と呼びます。

フィールドが情報なら、メソッドは動きです。

ドラゴンボール風に言えば、メソッドは 悟空やベジータたちが実際に行う行動 です。

たとえば、Warriorクラスには次のようなメソッドが考えられます。

メソッド役割
setName名前を設定する
setStyle流派を設定する
attack流派に応じて攻撃する
move戦場を移動する
chargeKi気を高める
showStatus現在の情報を表示する

戦士のメソッドのイメージは、次のようになります。

class Warrior {
    name
    styleMark
    styleName
    power
    stamina

    setName() {
        名前を設定する
    }

    setStyle() {
        流派を設定する
    }

    attack() {
        流派に応じて攻撃する
    }

    move() {
        戦場を移動する
    }

    showStatus() {
        名前、流派、戦闘力、体力を表示する
    }
}

ここで大切なのは、メソッドはクラスの外にあるばらばらの処理ではなく、そのクラスの情報に関係する動きとして書かれることです。

たとえば、状態を表示するという動きは、name、styleMark、styleName、power、staminaと深く関係しています。
だから、Warriorクラスの中に置くのが自然です。

Java風に書くと、次のようになります。

class Warrior {
    String name;
    String styleMark;
    String styleName;
    int power;
    int stamina;

    void setName(String newName) {
        name = newName;
    }

    void setStyle(String newStyleMark, String newStyleName) {
        styleMark = newStyleMark;
        styleName = newStyleName;
    }

    void attack() {
        System.out.println(name + "は" + styleName + "の技で攻撃する");
    }

    void move() {
        System.out.println(name + "は戦場を高速移動する");
    }

    void chargeKi() {
        System.out.println(name + "は気を高めた");
    }

    void showStatus() {
        System.out.println("名前: " + name);
        System.out.println("流派記号: " + styleMark);
        System.out.println("流派名: " + styleName);
        System.out.println("戦闘力: " + power);
        System.out.println("体力: " + stamina);
    }
}

この中の次の部分がメソッドです。

void setName(String newName)
void setStyle(String newStyleMark, String newStyleName)
void attack()
void move()
void chargeKi()
void showStatus()

メソッドは、フィールドの情報を使って処理を行うことが多いです。

たとえば、attackメソッドでは、nameとstyleNameを使っています。

void attack() {
    System.out.println(name + "は" + styleName + "の技で攻撃する");
}

これは、戦士の名前と流派名を使って、攻撃の内容を表示しています。

たとえば、nameに悟空、styleNameに亀仙流が入っていれば、悟空は亀仙流の技で攻撃する、という意味のある動きになります。

つまりメソッドは、クラスが持っている情報を使って、意味のある動きを実行する部分です。

図:フィールドとメソッドはクラスのメンバ

この図が示していること

この図は、クラスの中にあるフィールドとメソッドをまとめてメンバと呼ぶことを示しています。

左側のフィールドは、戦士の情報です。
名前、流派記号、流派名、戦闘力、体力のように、その戦士が持っている状態を表します。

右側のメソッドは、戦士の動きです。
流派を設定する、攻撃する、移動する、気を高める、状態を表示するというように、その戦士ができる処理を表します。

下部の「メンバ = フィールド + メソッド」によって、メンバという言葉がクラス内の部品全体を指すことが分かります。

フィールドとメソッドを合わせてメンバという

クラスの中にあるフィールドとメソッドは、まとめて メンバ と呼ばれます。

メンバという言葉だけ見ると少しかたく感じるかもしれませんが、意味はとてもシンプルです。

クラスを構成している部品のこと です。

用語役割
フィールド情報を持つ部品
メソッド動きを持つ部品
メンバフィールドとメソッドをまとめた呼び方

Warriorクラスなら、次のように整理できます。

種類
フィールドname、styleMark、styleName、power、stamina
メソッドsetStyle、attack、move、chargeKi、showStatus
メンバフィールドとメソッドすべて

たとえば、次のクラスを見てみます。

class Warrior {
    String name;
    String styleMark;
    String styleName;

    void attack() {
        System.out.println(name + "は" + styleName + "の技で攻撃する");
    }

    void showStatus() {
        System.out.println("名前: " + name);
        System.out.println("流派記号: " + styleMark);
        System.out.println("流派名: " + styleName);
    }
}

このクラスのメンバは、次のようになります。

メンバ種類
nameフィールド
styleMarkフィールド
styleNameフィールド
attackメソッド
showStatusメソッド

このように、クラスの中にある情報と動きをまとめてメンバと呼びます。

Javaの説明で「このクラスのメンバ」という言葉が出てきたら、クラスの中にあるフィールドやメソッドのこと と考えると分かりやすいです。

クラスを宣言するとは何をしているのか

クラスを書くことを、Javaでは クラスを宣言する といいます。

宣言という言葉は少しかたいですが、やっていることはシンプルです。

こういう情報を持つまとまりを作ります。
こういう機能を持つまとまりを作ります。
この名前のクラスとして定義します。

これがクラス宣言です。

ドラゴンボール風に言えば、次のような設計図を作っている状態です。

戦士クラスを作ります。
このクラスには名前、流派記号、流派名、戦闘力を持たせます。
さらに攻撃や状態表示の機能も持たせます。

戦士のクラス宣言のイメージは、次のようになります。

class Warrior {
    name
    styleMark
    styleName
    power

    attack() {
        流派に応じて攻撃する
    }

    showStatus() {
        名前、流派、戦闘力を表示する
    }
}

この段階では、まだ具体的な一人の戦士を作っているわけではありません。

悟空という戦士を作っているのではなく、Warriorという設計図 を用意している状態です。

ここで大切なのは、クラスはある一人だけの情報ではなく、共通の型を表すということです。

悟空専用のその場限りのデータではなく、戦士というまとまりを整理した土台を作っています。

Java風に書くと、次のようになります。

class Warrior {
    String name;
    String styleMark;
    String styleName;
    int power;

    void attack() {
        System.out.println(name + "は" + styleName + "の技で攻撃する");
    }

    void showStatus() {
        System.out.println("名前: " + name);
        System.out.println("流派記号: " + styleMark);
        System.out.println("流派名: " + styleName);
        System.out.println("戦闘力: " + power);
    }
}

このWarriorクラスは、戦士の共通の型です。

同じ設計図を使って、あとから悟空、ベジータ、悟飯、ピッコロ、クリリン、天津飯などを作れるようになります。

クラスは共通の型を表す

クラスを学ぶときに、とても大切な考え方があります。

それは、クラスは 具体的な一人 ではなく、共通の型 を表すということです。

たとえば、Warriorクラスは、悟空だけを表すものではありません。

悟空だけの情報。
ベジータだけの情報。
悟飯だけの情報。
ピッコロだけの情報。

これらを直接書いているわけではなく、戦士に共通する情報と動きをまとめています。

class Warrior {
    String name;
    String styleMark;
    String styleName;
    int power;
}

このクラスは、いろいろな戦士に使えます。

戦士namestyleMarkstyleNamepower
悟空悟空亀仙流9000
クリリンクリリン亀仙流4500
天津飯天津飯鶴仙流7000
ピッコロピッコロピッコロ魔族流8800
デンデデンデ神流、ナメック流3000
ベジータベジータ惑星戦士流9500
ナッパナッパ惑星戦士流7800
悟空悟空北の界王流9900

同じWarriorクラスでも、フィールドに入る値が変われば、別々の戦士を表せます。

ここで注目したいのは、悟空のように複数の流派や修行経験を持つキャラクターも、フィールドの値を変えれば表現できるという点です。

たとえば、亀仙流の悟空として見るなら、styleMarkは亀、styleNameは亀仙流になります。
北の界王のもとで修行した悟空として見るなら、styleMarkは界、styleNameは北の界王流になります。

つまりクラスは、具体的な値を入れる前の設計図です。

ドラゴンボール風に言えば、Warriorクラスは 戦士登録用の共通カード のようなものです。

登録欄内容
名前欄悟空、ベジータ、悟飯などを入れる
流派記号欄亀、鶴、武、塔、魔、神、惑、界などを入れる
流派名欄亀仙流、鶴仙流、北の界王流などを入れる
戦闘力欄強さの数値を入れる

この共通カードに具体的な値を入れることで、1人ひとりの戦士を表せます。

なぜクラスが必要なのか

クラスが必要な理由は、プログラムを整理しやすくするためです。

もしクラスを使わずに、名前、流派記号、流派名、戦闘力、体力、攻撃処理、表示処理をすべて別々に書いていたら、戦士が増えるたびに管理が大変になります。

たとえば、クラスを使わずに書くと、次のようになります。

String name1 = "悟空";
String styleMark1 = "亀";
String styleName1 = "亀仙流";
int power1 = 9000;

String name2 = "ベジータ";
String styleMark2 = "惑";
String styleName2 = "惑星戦士流";
int power2 = 9500;

String name3 = "ピッコロ";
String styleMark3 = "魔";
String styleName3 = "ピッコロ魔族流";
int power3 = 8800;

人数が少ないうちは、まだ読めます。

しかし、悟空、ベジータ、悟飯、ピッコロ、クリリン、天津飯、ヤムチャ、トランクス、フリーザ、セルのように、管理する対象が増えていくと、どの名前が誰のものなのか、どの流派が誰のものなのかが分かりにくくなります。

さらに、攻撃処理や状態表示の処理も追加されると、コードはもっと複雑になります。

クラスを使えば、戦士に必要な情報と動きをひとまとまりにできます。

class Warrior {
    String name;
    String styleMark;
    String styleName;
    int power;

    void attack() {
        System.out.println(name + "は" + styleName + "の技で攻撃する");
    }

    void showStatus() {
        System.out.println("名前: " + name);
        System.out.println("流派記号: " + styleMark);
        System.out.println("流派名: " + styleName);
        System.out.println("戦闘力: " + power);
    }
}

このようにしておけば、戦士に関係する情報と動きがWarriorクラスにまとまります。

クラスを使うメリットは次のとおりです。

メリット説明
情報をまとめられる名前、流派記号、流派名、戦闘力などを1つのまとまりにできる
動きをまとめられる攻撃、移動、気を高める、状態表示などを一緒に管理できる
コードが読みやすくなる何についての処理なのか分かりやすい
修正しやすくなる変更する場所を見つけやすい
同じ型を使い回せる複数の戦士を同じ設計図から作れる

クラスは、プログラムが大きくなったときほど力を発揮します。

戦士が増えても、Warriorという共通の設計図があれば、情報と動きを整理しながら扱えます。

クラスを見るときのコツ

クラスの学び始めで迷いやすいのは、クラスの中にいろいろ書かれていて、何が何だか分からなくなることです。

そんなときは、次の順番で見ると理解しやすいです。

見る順番確認することドラゴンボール風の見方
1何についてのクラスか悟空やベジータのような戦士についての設計図か
2どんな情報を持つか名前、流派記号、流派名、戦闘力、体力など
3どんな動きをするか攻撃する、移動する、気を高める、状態を表示するなど

たとえば、次のクラスを見てみます。

class Warrior {
    String name;
    String styleMark;
    String styleName;

    void attack() {
        System.out.println(name + "は" + styleName + "の技で攻撃する");
    }

    void showStatus() {
        System.out.println("名前: " + name);
        System.out.println("流派記号: " + styleMark);
        System.out.println("流派名: " + styleName);
    }
}

まず見るのは、クラス名です。

class Warrior

これで、戦士についてのクラスだと分かります。

次にフィールドを見ます。

String name;
String styleMark;
String styleName;

これで、このクラスは名前、流派記号、流派名を情報として持つことが分かります。

最後にメソッドを見ます。

void attack()
void showStatus()

これで、このクラスは攻撃する、状態を表示するという動きを持つことが分かります。

この順番で見ると、クラスの中身がかなり整理しやすくなります。

図:クラス宣言は共通の型を作ること

この図が示していること

この図は、クラス宣言が「具体的な一人を作ること」ではなく、「共通の設計図を作ること」だと示しています。

左側の巻物には、Warriorクラスの共通項目があります。
name、styleMark、styleName、powerは情報で、attack、showStatusは動きです。

右側の複数の戦士カードは、同じクラスに違う値を入れることで、別々の戦士を表せることを示しています。

つまり、クラスは1回作って終わりではありません。
同じ設計図を使い回して、悟空、ベジータ、ピッコロ、天津飯など、さまざまな実体を作るための共通の型になります。

クラスの基本構造をイメージコードで整理する

ここまでの内容を、ひとつのイメージコードとして整理してみます。

class Warrior {
    name
    styleMark
    styleName
    power
    stamina
    equipment

    setName() {
        名前を設定する
    }

    setStyle() {
        流派記号と流派名を設定する
    }

    setPower() {
        戦闘力を設定する
    }

    attack() {
        流派に応じた技で攻撃する
    }

    move() {
        戦場を移動する
    }

    chargeKi() {
        気を高める
    }

    showStatus() {
        名前を表示する
        流派記号を表示する
        流派名を表示する
        戦闘力を表示する
        体力を表示する
        装備を表示する
    }
}

この形を見ると、クラスの基本がよく分かります。

上のほうには情報がまとまっています。

情報内容
name名前
styleMark流派記号
styleName流派名
power戦闘力
stamina体力
equipment装備

下のほうには動きがまとまっています。

動き内容
setName名前を設定する
setStyle流派を設定する
setPower戦闘力を設定する
attack攻撃する
move移動する
chargeKi気を高める
showStatus状態を表示する

そして、どちらも戦士に関係する内容だけでそろっています。

ここが大切です。

クラスの中に何でも入れてよいわけではありません。
Warriorクラスなら、戦士に関係する情報と動きを入れます。

そうすることで、コードが読みやすくなり、あとから手を加えるときも整理しやすくなります。

Javaの基本構造

イメージコードをJava風に書くと、次のようになります。

class Warrior {
    String name;
    String styleMark;
    String styleName;
    int power;
    int stamina;
    String equipment;

    void setName(String newName) {
        name = newName;
    }

    void setStyle(String newStyleMark, String newStyleName) {
        styleMark = newStyleMark;
        styleName = newStyleName;
    }

    void setPower(int newPower) {
        power = newPower;
    }

    void attack() {
        System.out.println(name + "は" + styleName + "の技で攻撃する");
    }

    void move() {
        System.out.println(name + "は戦場を高速移動する");
    }

    void chargeKi() {
        System.out.println(name + "は気を高めた");
    }

    void showStatus() {
        System.out.println("名前: " + name);
        System.out.println("流派記号: " + styleMark);
        System.out.println("流派名: " + styleName);
        System.out.println("戦闘力: " + power);
        System.out.println("体力: " + stamina);
        System.out.println("装備: " + equipment);
    }
}

このコードでは、Warriorクラスの中に、フィールドとメソッドがまとまっています。

区分内容
フィールドname、styleMark、styleName、power、stamina、equipment
メソッドsetName、setStyle、setPower、attack、move、chargeKi、showStatus

フィールドは、戦士の情報です。
メソッドは、戦士の動きです。

この2つをひとつのクラスにまとめることで、戦士に関するコードとして整理できます。

原作キャラクター名を使った流派設定の見方

今回のWarriorクラスでは、流派をstyleMarkとstyleNameの2つで表しています。

フィールド役割
styleMark短く流派を表す記号
styleName亀仙流流派の正式名称

たとえば、悟空を亀仙流の戦士として見るなら、次のようなイメージです。

name = "悟空";
styleMark = "亀";
styleName = "亀仙流";

ベジータを惑星戦士流の戦士として見るなら、次のようになります。

name = "ベジータ";
styleMark = "惑";
styleName = "惑星戦士流";

ピッコロをピッコロ魔族流の戦士として見るなら、次のようになります。

name = "ピッコロ";
styleMark = "魔";
styleName = "ピッコロ魔族流";

天津飯を鶴仙流の戦士として見るなら、次のようになります。

name = "天津飯";
styleMark = "鶴";
styleName = "鶴仙流";

このように、同じWarriorクラスでも、名前や流派の値を変えることで、違う戦士を表せます。

つまり、クラスは共通の設計図であり、フィールドに入る値によって、具体的な戦士の個性が決まるということです。

クラスを学ぶ最初の段階で大切なこと

クラスを学ぶ最初の段階では、いきなり難しい用語をすべて完璧に覚えようとしなくても大丈夫です。

まずは、次の考え方をしっかりつかむことが大切です。

用語最初に押さえるイメージ
クラス情報と動きをひとまとめにする設計図
フィールドクラスが持つ情報
メソッドクラスが持つ動き
メンバフィールドとメソッドをまとめた呼び方
クラス宣言その設計図を作ること

ドラゴンボール風に考えるなら、クラスとは 悟空やベジータのような戦士を作る設計図 を作ることです。

その設計図の中に、名前、流派記号、流派名、戦闘力、体力のような情報があります。
攻撃する、移動する、気を高める、状態を表示するという動きもあります。
それらをひとつの部品として整理していくのが、Javaのクラスの基本です。

そして今回のように原作キャラクター名と流派を組み合わせると、戦士クラスのイメージはさらに分かりやすくなります。

悟空は、亀仙流や北の界王流の値を持つ戦士として表せます。
ベジータは、惑星戦士流の値を持つ戦士として表せます。
ピッコロは、ピッコロ魔族流や神流、ナメック流の値を持つ戦士として表せます。
天津飯は、鶴仙流の値を持つ戦士として表せます。
クリリンは、亀仙流の値を持つ戦士として表せます。

これらはすべて、Warriorという共通の設計図から表現できます。
違うのは、フィールドに入る名前や流派、戦闘力の値です。

この感覚を持てるようになると、Javaのクラスは「難しい文法」ではなく、「情報と動きを整理して、意味のある部品を作るしくみ」として理解しやすくなります。