6日でできる 新Java入門|クラスのフィールド

クラスの中にどんな力を持たせるかが分かると、Javaの設計はぐっと見通しやすくなる。フィールドを学んで、クラスに命を吹き込もう

Javaでクラスを学び始めると、だんだん ただ命令を書く だけではなく、データと処理をひとまとまりで考える感覚が大切になってきます。その中心にあるのが フィールド です。フィールドは、クラスが持っている情報そのものを表します。たとえば戦士の名前、戦闘力、修行回数、変身段階など、そのクラスが管理したいデータを持たせる場所です。

ドラゴンボールの世界でたとえるなら、クラスは サイヤ人の設計図 のようなものです。そしてフィールドは、そのサイヤ人が生まれつき持っている情報や、修行によって変わっていく数値を記録するための領域です。どんな技を使えるかも大事ですが、その前に 今どんな状態なのか を持っていなければ、クラスは動きのない空っぽの設計図になってしまいます。

この記事では、クラスの基本構造を確認しながら、フィールドの種類と役割を丁寧に見ていきます。とくに、インスタンスごとに異なる値を持つ インスタンスフィールド、クラス全体で共有される クラスフィールド、書き換えできない 定数フィールド を中心に整理します。例示するプログラムは Lesson17_1.java のみを使い、サイヤ人クラス風の流れで、フィールドがどう働くのかを分かりやすく見ていきます。

クラスの中でフィールドはどんな役割を持つのか

クラスは、大きく見ると フィールド、コンストラクタ、メソッド で構成されます。フィールドがデータ、コンストラクタが初期化、メソッドが操作を担当します。この3つがそろうことで、クラスは 何の情報を持ち、どう生まれ、どう動くか を表せるようになります。

クラスの構造

要素内容ドラゴンボール風のたとえ
フィールドクラスが管理するデータ戦闘力、名前、修行回数
コンストラクタインスタンス生成時の初期化処理戦士が誕生するときの初期設定
メソッドクラスの操作手段技を使う、状態を確認する

ドラゴンボール風に言えば、サイヤ人の設計図に どんな能力を持つか、どうやって誕生するか、どんな技を出せるか がまとまっている状態です。フィールドはその中でも、クラスの 土台になる情報 を担当しています。

フィールドとは何か

フィールドとは、クラスの中に定義する変数のことです。クラスが持つデータを保存しておく場所だと考えると分かりやすいです。

たとえば、サイヤ人クラスを考えるなら、次のような情報がフィールドになりそうです。

  • 名前
  • 戦闘力
  • 変身段階
  • 修行回数

これらはどれも、サイヤ人という存在が持っている データ です。フィールドがあるからこそ、そのクラスのインスタンスは自分の状態を持てます。

フィールドの基本イメージ

項目内容
定義場所クラスの中
役割クラスが管理するデータを保存する
int power; String name;

ドラゴンボール風にたとえるなら、フィールドは 戦士プロフィールの記録欄 です。そこに戦闘力や名前を書き込むことで、どの戦士なのかがはっきりします。

フィールドの種類

フィールドには、役割の違いによっていくつかの種類があります。とくに大事なのが、インスタンスフィールド、クラスフィールド、定数フィールドです。

フィールドの種類と特徴

フィールドの種類説明宣言例備考
インスタンスフィールドインスタンスごとに独立した値を持つprivate int power;オブジェクトごとに異なる
クラスフィールドクラス全体で共有される値を持つpublic static int count = 0;全インスタンス共通
定数フィールド書き換えできない一定の値を持つpublic static final int LIMIT = 100;変更不可

この3つは似ているようで役割がかなり違います。ここを区別して理解すると、クラス設計がかなり見やすくなります。

インスタンスフィールドとは何か

インスタンスフィールドは、作られたインスタンスごとに別々の値を持つフィールドです。たとえば、サイヤ人Aの戦闘力が 5000、サイヤ人Bの戦闘力が 8000 というように、同じクラスから作られていても個別の状態を持てます。

ドラゴンボール風に言えば、同じ サイヤ人の設計図 から生まれたとしても、悟空とベジータで戦闘力や修行履歴が違うのと同じです。その 個別の違い を保存するのがインスタンスフィールドです。

インスタンスフィールドの特徴

特徴内容
値の持ち方インスタンスごとに別々
向いている情報名前、戦闘力、現在の状態など
private int power;

クラスフィールドとは何か

クラスフィールドは、すべてのインスタンスで共有されるフィールドです。static を付けて宣言します。これは そのクラス全体で1つだけ持つ情報 に向いています。

たとえば、今までに何人のサイヤ人インスタンスを生成したか、という数は、個々のインスタンスごとに別れているより、クラス全体で共通の1つの値として持つ方が自然です。

ドラゴンボール風にいえば、サイヤ人一人ひとりの戦闘力ではなく、サイヤ人戦士が全部で何人誕生したかという 総数の記録札 のようなものです。

クラスフィールドの特徴

特徴内容
値の持ち方全インスタンスで共有
宣言方法static を付ける
向いている情報総数、共通設定、共有データ
public static int count = 0;

定数フィールドとは何か

定数フィールドは、いったん決めたら変更しない値を表します。static final を付けて宣言することが多いです。プログラム全体で共通して使う 固定値 に向いています。

ドラゴンボール風にたとえるなら、修行場の最大人数や、試験の満点のような ルールとして固定された数値 です。途中で変わってはいけないものに使います。

定数フィールドの特徴

特徴内容
値の変更できない
宣言方法static final を付けることが多い
向いている情報上限値、定義済みルール、固定設定
public static final int LIMIT = 100;

フィールドを使ったクラスの例

ここでは、サイヤ人クラス風の流れで、インスタンスフィールド、クラスフィールド、定数フィールドをまとめて持つ例を見ていきます。例示するプログラムは Lesson17_1.java のみです。

ファイル名:Lesson17_1.java

public class Lesson17_1 {
    // インスタンスフィールド
    private int power;

    // クラスフィールド(全インスタンス共通)
    public static int warriorCount = 0;

    // 定数フィールド
    public static final int MAX_LEVEL = 100;

    // コンストラクタ
    public Lesson17_1(int p) {
        this.power = p;
        warriorCount++; // インスタンス生成ごとに総数を増やす
    }

    // インスタンスメソッド
    public int getPower() {
        return power;
    }

    // クラスメソッド
    public static int getWarriorCount() {
        return warriorCount;
    }

    public static void main(String[] args) {
        Lesson17_1 saiyan1 = new Lesson17_1(10);
        Lesson17_1 saiyan2 = new Lesson17_1(20);

        System.out.println("saiyan1の戦闘力: " + saiyan1.getPower());
        System.out.println("saiyan2の戦闘力: " + saiyan2.getPower());
        System.out.println("サイヤ人の総数: " + Lesson17_1.getWarriorCount());
        System.out.println("最大レベル: " + Lesson17_1.MAX_LEVEL);
    }
}

実行結果

saiyan1の戦闘力: 10
saiyan2の戦闘力: 20
サイヤ人の総数: 2
最大レベル: 100

このプログラムには、3種類のフィールドが入っています。

  • power はインスタンスフィールド
  • warriorCount はクラスフィールド
  • MAX_LEVEL は定数フィールド

それぞれがどんな働きをしているかを、順番に見ていきます。

このクラスで power が果たしている役割

power は private int power; と宣言されています。これはインスタンスフィールドです。つまり、saiyan1 と saiyan2 は、それぞれ別々の power を持っています。

実際に、saiyan1 は 10、saiyan2 は 20 を持っています。同じクラスから生まれていても、値は別々です。

power の役割

インスタンスpower の値
saiyan110
saiyan220

このように、インスタンスフィールドは 個々のオブジェクトの個性 を表すのに向いています。

このクラスで warriorCount が果たしている役割

warriorCount は public static int warriorCount = 0; と宣言されています。これはクラスフィールドです。つまり、サイヤ人インスタンスが何体あっても、warriorCount 自体は1つだけです。

コンストラクタの中で warriorCount++; しているため、新しいインスタンスが作られるたびに値が1増えます。その結果、saiyan1 と saiyan2 が生成されたあと、総数は 2 になります。

warriorCount の役割

タイミングwarriorCount の値
最初0
saiyan1生成後1
saiyan2生成後2

これは 全インスタンスで共有する情報 の代表的な使い方です。

このクラスで MAX_LEVEL が果たしている役割

MAX_LEVEL は public static final int MAX_LEVEL = 100; と宣言されています。これは定数フィールドです。static なのでクラス全体で共有され、final なので値は変更できません。

この値は、どのサイヤ人にも共通する 最大レベルの上限 を表すような役割を持っています。変更されない決まり事を表すのに向いています。

MAX_LEVEL の役割

項目
最大レベル100

ドラゴンボール風にいえば、これは 修行規定で決まっている上限値 のようなものです。途中で書き換わってしまうと困るので、定数にして守ります。

コンストラクタとフィールドの関係

このクラスでは、コンストラクタがフィールドの初期化に使われています。

public Lesson17_1(int p) {
    this.power = p;
    warriorCount++;
}

ここでは、受け取った p をインスタンスフィールド power に代入しています。また、インスタンス生成のたびに warriorCount を増やしています。

つまり、コンストラクタは フィールドに最初の値を入れる場所 だと考えると分かりやすいです。

コンストラクタの役割

処理内容
this.power = p;インスタンスごとの戦闘力を設定する
warriorCount++;クラス全体の総数を増やす

このように、コンストラクタはフィールドととても深く関わっています。

フィールドへのアクセスと private の意味

このクラスでは、power は private にしています。これは 外から直接アクセスできないようにする ためです。

その代わりに、getPower() というメソッドを用意して、値を取り出せるようにしています。

public int getPower() {
    return power;
}

これは Javaでとてもよく使う考え方です。フィールドをそのまま見せるのではなく、必要な方法を通して扱うようにします。

アクセス修飾子の違い

修飾子アクセス範囲説明
publicどこからでもアクセス可能外部から見える
protected同じパッケージやサブクラス継承でも使える
なし同じパッケージ内パッケージプライベート
private同じクラス内のみ外から直接触れない

フィールドは private にして、必要に応じて getter や setter を通すのが基本的な考え方です。

ドラゴンボール風にたとえるなら、戦士の本当の気の流れを外から直接いじるのではなく、決められた訓練手順や確認手順を通して扱うようなものです。

Java標準クラスにも定数フィールドがある

定数フィールドは、自分で作るクラスだけでなく、Java標準クラスにも多く用意されています。たとえば Integer クラスには、最大値や最小値、ビット数を表す定数フィールドがあります。

Integerクラスの定数フィールド例

定数意味
Integer.MAX_VALUEint型の最大値2147483647
Integer.MIN_VALUEint型の最小値-2147483648
Integer.SIZEint型のビット数32

このように、Java標準クラスも クラスフィールド や 定数フィールド を活用して作られています。自分でクラスを作るときにも、とても参考になります。

クラスのフィールド全体を図で整理

フィールドには、インスタンスごとに持つもの、クラス全体で共有するもの、固定値として持つものがあります。これを図にすると、違いがかなり見やすくなります。

下図は、1つのクラスの中に インスタンスフィールド、クラスフィールド、定数フィールド があることを示したものです。中央にクラスの設計図、その下に saiyan1 と saiyan2 のようなインスタンスを置き、インスタンスごとに別々の power を持つ一方で、warriorCount は共有され、MAX_LEVEL は固定値として共通であることを表しています。

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

この図が示していること

この図は、同じクラスの中にあっても、フィールドには 個別に持つもの、共有するもの、固定のもの があることを示しています。とくに、インスタンスごとに値が違うものと、全体で共通なものの違いが見える構成です。

この図から分かること

この図を見ると、フィールドは全部が同じ種類の変数ではないことが分かります。インスタンスフィールドは個性、クラスフィールドは共有情報、定数フィールドはルールや固定値に向いていることが分ります。

フィールドとコンストラクタとメソッドの関係を図で整理

下図は、コンストラクタがフィールドへ初期値を入れ、メソッドがそのフィールドを読み取ったり返したりする流れを示したものです。インスタンス生成時に power が設定され、その後 getPower() で取り出せる、warriorCount は生成ごとに増える、というつながりが見える構成になっています。

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

この図が示していること

この図は、クラスの中でフィールドが単独で存在するのではなく、コンストラクタによって初期化され、メソッドによって利用される関係を示しています。クラス内部の役割分担が見える構成です。

この図から分かること

この図を見ると、クラスは フィールドだけ、メソッドだけ で成り立つのではなく、それぞれが連携して動いていることが分かります。フィールドがクラスの状態を持ち、コンストラクタとメソッドがその状態を扱うという流れが分かります。

フィールドを理解すると、クラスが何を持つ存在なのかが見えてくる

Javaでクラスを理解するとき、フィールドはとても大事な入口です。フィールドがあるからこそ、クラスは自分の状態を持てます。そして、その状態がインスタンスごとに違うのか、全体で共有するのか、ずっと固定なのかを考えることで、クラス設計の考え方がかなり整理されます。

ドラゴンボールの世界でも、サイヤ人には個別の戦闘力があり、戦士全体の人数があり、変わらない修行規定があります。Javaのフィールドもそれと同じで、個性、共有情報、固定ルールを持たせるための大切な仕組みです。