【Java】レッスン5-4:クラスメンバとインスタンスメンバを理解しよう

一つ前のページではカプセル化について学習しました。
今回は クラスメンバとインスタンスメンバ について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:クラス編
・Lesson5-1:クラスの基本を確認しよう
・Lesson5-2:コンストラクタを理解しよう
・Lesson5-3:カプセル化を理解しよう
・Lesson5-4:クラスメンバとインスタンスメンバ ◁今回はココ
・Lesson5-5:クラスの継承を理解しよう
・Lesson5-6:メソッドのオーバーライドを理解しよう
・Lesson5-7:抽象クラスを理解しよう
・Lesson5-8:インターフェースを理解しよう
・確認問題5-☆1:モンスター捕獲ゲームを作ろう
・確認問題5-☆2:モンスターとのバトルゲームを作ろう
・確認問題5-☆3:マルバツゲーム(Tic-Tac-Toe)を作成しよう
クラスメンバとインスタンスメンバの基礎|違いと使い分けを解説
Javaのクラスには、すべてのインスタンスで共有される クラスメンバ(staticメンバ)と、インスタンスごとに固有の値や動作を持つ インスタンスメンバ があります。
これらの違いを理解することで、データやメソッドをどのスコープで扱うべきかを適切に判断でき、効率的かつ意図通りに動作するプログラムを設計できます。
本記事では、クラスメンバとインスタンスメンバの特徴や使い分け、static
やthis
といった関連キーワード、実際のコード例までを初心者向けに解説します。
これを学べば、より明確で保守性の高いクラス設計ができるようになるでしょう。
それでは、メンバの使い分けの基礎を押さえていきましょう。

メンバとは何か|クラスメンバとインスタンスメンバの違い
メンバ とは、クラスの中に含まれるフィールドとメソッドを合わせた総称であり、大きくクラスメンバとインスタンスメンバの2種類があります。
クラスメンバは「クラス全体で共有される」ものであり、インスタンスメンバは「各インスタンス(オブジェクト)ごとに持つ」ものを指します。
・クラスメンバ:クラス全体で使用される変数やメソッド
・インスタンスメンバ:インスタンスごとに異なるデータを保持する変数やメソッド
ここまでの学習で使用してきたメンバは全てインスタンスメンバです。
クラスメンバとは何か|staticによる共通データの定義と使い方
クラスメンバはクラス全体で使用される変数やメソッドのことをいい、それぞれ クラス変数、クラスメソッド と呼びます。
クラス変数は全てのインスタンス間で共通の値を保持し、クラスメソッドはインスタンス生成しなくてもクラスから直接呼び出すことができます。
クラスメンバは static
キーワード を用いて定義されます。
以下にクラスメンバの使用例を示します。
public class Counter { // Counterクラスの定義 static int count = 0; // クラス変数の宣言 public static void increment() { // クラスメソッドの定義 count++; } } class Main { // メインクラス public static void main(String[] args) { System.out.println(Counter.count); // インスタンス生成せずにクラス変数にアクセス(出力:0) Counter.increment(); // インスタンス生成せずにクラスメソッドの呼び出し System.out.println(Counter.count); // 出力:1 } }
この例ではcount
はクラス変数として定義されており、インスタンス生成せずにアクセスすることができます。
また複数のインスタンスを生成した場合もすべてのインスタンスで共有されるため、どのインスタンスからでも同じcount
にアクセスしてその値を確認できます。
increment
メソッドもクラスメソッドとして定義されており、クラス名を使って直接呼び出すことが可能です(Counter.increment()
)。
インスタンスメンバとは何か|オブジェクトごとのデータや動作の持たせ方
インスタンスメンバはインスタンスごとに異なるデータを保持する変数やメソッドをいい、それぞれ インスタンス変数、インスタンスメソッド と呼びます。
ここまでのレッスン5-3までの学習で見てきたメンバは全てインスタンスメンバになります。
インスタンスメンバは各インスタンスごとに独立した値を持つため、static
キーワードを使用せずに定義されます。
以下にインスタンスメンバの使用例を示します。
public class Person { String name; // インスタンス変数 public void setName(String name) { // インスタンスメソッド(セッター) this.name = name; } public String getName() { // インスタンスメソッド()ゲッター return this.name; } }
この例では、name
はインスタンス変数として定義され、各インスタンスごとに異なる値を持ちます。
setName
およびgetName
はインスタンスメソッドであり、インスタンスごとにname
の値を設定および取得するために使用します。
this
キーワードはそのインスタンス自身を指すために用いられます。
クラスメンバとインスタンスメンバの違い|比較表で整理
クラスメンバとインスタンスメンバには、以下のような違いがあります。
特徴 | クラスメンバ | インスタンスメンバ |
---|---|---|
キーワード | static | なし |
メモリの共有 | すべてのインスタンスで共有 | 各インスタンスごとに独立 |
アクセス方法 | クラス名で直接アクセス | インスタンスを通してアクセス |
使用する場面 | 共通データやユーティリティメソッド | 個別のデータやオブジェクト固有の動作 |
クラスメンバはstatic
キーワードを使って宣言され、すべてのインスタンスで同じデータを共有するため、メモリの節約や共通機能の提供に適しています。
一方でインスタンスメンバはインスタンスごとに独立してデータを保持できるため、個別のデータや振る舞いが必要な場合に使用されます。
これらを使い分けることで、より効率的で可読性の高いコードが実現できます。
まとめ|状況に応じたメンバの使い分けの基礎
今回の学習では、クラスメンバとインスタンスメンバの違い、それぞれの役割や使いどころ、そしてstatic
を使った共通データの定義方法や、インスタンスごとに固有のデータを持たせる方法について学びました。
これにより、状況に応じてメンバを正しく使い分け、効率的かつ意図通りに動作するクラス設計ができるようになります。
メンバの設計を適切に行うことは、コードの保守性や可読性の向上にも直結する重要なスキルです。
ここで得た知識を活かし、より洗練されたクラス構造を目指して学習を進めていきましょう。
練習問題|クラス変数とインスタンス変数を使い分けて本を管理しよう

図書館の蔵書を管理するためのプログラムを作成しましょう。
このプログラムでは全体の蔵書数をクラスメンバ(クラス変数)で管理し、各図書の名前をインスタンスメンバ(インスタンス変数)で保持します。
本を追加するたびに総蔵書数が増加するようにし、それぞれの本の名前と総蔵書数を表示するメソッドを作成してください。
この問題の要件
以下の要件に従ってコードを完成させてください。
Library
というクラスを作成し、以下のように定義すること。- クラス変数
totalBooks
を定義し、初期値は0
とすること。この変数は全体の蔵書数を保持する。 - インスタンス変数
bookName
を定義し、本の名前を保持する。
- クラス変数
- コンストラクタを定義し、引数として本の名前を受け取り、インスタンス変数
bookName
にその名前を設定すること。- また、クラス変数
totalBooks
を1増加させること。
- また、クラス変数
- クラスメソッド
displayTotalBooks
を定義し、現在の蔵書数(totalBooks
の値)を出力すること。 - インスタンスメソッド
displayBookName
を定義し、その本の名前(bookName
の値)を出力すること。 main
メソッドで以下を実行すること:- 図書館に本を2冊追加し、それぞれの本の名前を表示すること。
- 総蔵書数を表示すること
ただし、以下のような実行結果となること。
本の名前: Java入門 本の名前: プログラミング基礎 総本数: 2
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:Libraryクラスの定義
□ クラス変数totalBooks
の定義と初期化
□ インスタンス変数bookName
の宣言
□ コンストラクタの定義
□ □ 引数name
をbookName
に設定
□ □ クラス変数totalBooks
を1増加
□ クラスメソッドdisplayTotalBooks
の定義
□ □ 総本数を表示
□ インスタンスメソッドdisplayBookName
の定義
□ □bookName
を表示
□ mainメソッドの定義
□ □ Libraryクラスのインスタンスbook1
を生成し、”Java入門”を設定
□ □ Libraryクラスのインスタンスbook2
を生成し、”プログラミング基礎”を設定
□ □book1
のdisplayBookName
メソッドを呼び出し、名前を表示
□ □book2
のdisplayBookName
メソッドを呼び出し、名前を表示
□ □displayTotalBooks
メソッドを呼び出し、総本数を表示
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
public class Library { // クラスメンバ(クラス変数):すべてのインスタンスで共有されるカウンタ /* 【穴埋め問題1】 ここにクラス変数を定義し、初期値を0に設定するコードを書いてください。 */ // インスタンスメンバ(インスタンス変数):各インスタンスごとに異なる本の名前 /* 【穴埋め問題2】 ここにインスタンス変数を定義し、本の名前を格納できるようにするコードを書いてください。 */ // コンストラクタ:新しい本を追加するときに本の名前を設定し、クラスメンバのカウンタを増加させる public Library(String name) { /* 【穴埋め問題3】 ここでインスタンス変数に引数nameを代入するコードを書いてください。 */ /* 【穴埋め問題4】 ここでクラス変数を1増加させるコードを書いてください。 */ } // クラスメソッド:総本数を出力する(クラスメンバの値を表示) public static void displayTotalBooks() { /* 【穴埋め問題5】 ここでクラス変数totalBooksの値を出力するコードを書いてください。 */ } // インスタンスメソッド:本の名前を出力する(インスタンスメンバの値を表示) public void displayBookName() { /* 【穴埋め問題6】 ここでインスタンス変数bookNameの値を出力するコードを書いてください。 */ } public static void main(String[] args) { // 2つの本のインスタンスを作成 Library book1 = new Library("Java入門"); Library book2 = new Library("プログラミング基礎"); // 各インスタンスの本の名前を表示 book1.displayBookName(); book2.displayBookName(); // 総本数を表示(クラスメンバの使用) Library.displayTotalBooks(); } }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
練習問題の解答と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
public class Library { // クラスメンバ(クラス変数):すべてのインスタンスで共有されるカウンタ static int totalBooks = 0; // インスタンスメンバ(インスタンス変数):各インスタンスごとに異なる本の名前 private String bookName; // コンストラクタ:新しい本を追加するときに本の名前を設定し、クラスメンバのカウンタを増加させる public Library(String name) { this.bookName = name; // インスタンス変数に値を設定 totalBooks++; // クラス変数を増加 } // クラスメソッド:総本数を出力する(クラスメンバの値を表示) public static void displayTotalBooks() { System.out.println("総本数: " + totalBooks); } // インスタンスメソッド:本の名前を出力する(インスタンスメンバの値を表示) public void displayBookName() { System.out.println("本の名前: " + this.bookName); } public static void main(String[] args) { // 2つの本のインスタンスを作成 Library book1 = new Library("Java入門"); Library book2 = new Library("プログラミング基礎"); // 各インスタンスの本の名前を表示 book1.displayBookName(); book2.displayBookName(); // 総本数を表示(クラスメンバの使用) Library.displayTotalBooks(); } }
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
クラスの定義とクラス変数(クラスメンバ)
public class Library { static int totalBooks = 0;
ここでは
Library
というクラスを定義し、その中にtotalBooks
というクラス変数(クラスメンバ)を設定しています。この
totalBooks
はstatic
キーワードを使って宣言されています。クラスメンバはクラス全体で共有され、すべてのインスタンスで共通の値を保持します。つまり
Library
クラスのインスタンスが複数作られても、totalBooks
の値はすべてのインスタンスで共通になります。インスタンス変数(インスタンスメンバ)の定義
private String bookName;
bookName
はインスタンス変数(インスタンスメンバ)です。private
キーワードを使ってカプセル化されているため、クラス外から直接アクセスすることはできません。インスタンスメンバは各インスタンスごとに独立した値を保持するため、複数のインスタンスが異なる本の名前を保持することができます。
コンストラクタの定義
public Library(String name) { this.bookName = name; totalBooks++; }
コンストラクタは新しいインスタンスが作成された際に実行される特別なメソッドです。
ここでは
bookName
に本の名前を設定し、クラス変数totalBooks
の値を1増加させています。これにより新しい本が追加されるたびに、図書館の総蔵書数が自動的に更新されます。
クラスメソッドとインスタンスメソッド
public static void displayTotalBooks() { System.out.println("総本数: " + totalBooks); } public void displayBookName() { System.out.println("本の名前: " + this.bookName); }
displayTotalBooks
はクラスメソッドであり、static
キーワードが付いています。クラスメソッドはクラス名を使って直接呼び出すことができ、インスタンスを通さなくても利用可能です。
一方
displayBookName
はインスタンスメソッドであり、インスタンスごとに異なる本の名前を表示します。このようにクラスメソッドはクラス全体で共有されるデータを扱い、インスタンスメソッドは各インスタンス固有のデータを操作することが一般的です。
メインメソッド:プログラムの実行
public static void main(String[] args) { Library book1 = new Library("Java入門"); Library book2 = new Library("プログラミング基礎"); book1.displayBookName(); book2.displayBookName(); Library.displayTotalBooks(); } }
main
メソッドではLibrary
クラスのインスタンスを2つ作成し、それぞれ異なる本の名前を設定しています。その後、各インスタンスの名前を表示し、最終的に図書館の総蔵書数をクラスメソッドで表示します。
この部分は、クラスメンバとインスタンスメンバの使い分けを実際のコードで確認する良い例です。