第6回では、メソッドで処理をまとめる方法を学びました。 今回はいよいよ Java の核となる概念 ── クラスとオブジェクト に入ります。
「オブジェクト指向?難しそう…」と感じるかもしれませんが、安心してください。 クラスは「設計図」、オブジェクトは「実物」、というシンプルなたとえを軸に、ゆっくり丁寧に進めていきます。
この記事のゴール
「クラスとオブジェクトの違い」「自分で簡単なクラスを書ける」「new・this キーワードの意味」を理解することです。
クラスとオブジェクトの違い(現実世界のたとえ)
まず、用語を 1 つずつ確認しましょう。
| 用語 | 例え | 説明 |
|---|---|---|
| クラス(Class) | 設計図・型 | 「車とはこういうもの」という定義 |
| オブジェクト(Object) | 実物・インスタンス | 設計図から作られた、実際の「私のトヨタ車」 |
💡 イメージ: クラスは 「たい焼きの鉄板」、オブジェクトは 「焼き上がったたい焼き」。1 つの鉄板から、たい焼きは何個でも作れます。同じように、1 つのクラスから、オブジェクトは何個でも作れます。
たとえば、「人」というクラスがあって、その設計図には:
- 持つ情報(フィールド): 名前・年齢・身長
- できる動作(メソッド): 自己紹介する・歩く・話す
が書かれている、と想像してください。 このクラスから「佐藤さん」「田中さん」というオブジェクトが作られると、それぞれが**独立した「実物の人」**として動きます。
はじめてのクラスを書いてみる
実際に、Person(人) クラスを書いてみましょう。
// Person.java ← ファイル名は public class 名と同じにする
public class Person {
// ── フィールド(クラスが持つデータ・変数のクラス版) ──
String name; // 名前を保存する場所
int age; // 年齢を保存する場所
// ── コンストラクタ:オブジェクトを new で作るときに呼ばれる特別なメソッド ──
// 特徴: ① 名前がクラス名と同じ ② 戻り値の型を書かない
public Person(String n, int a) {
name = n; // 引数 n をフィールド name に保存
age = a; // 引数 a をフィールド age に保存
}
// ── メソッド:このクラスができる「動作」 ──
public void introduce() {
// フィールドの name / age を使って自己紹介を出力
System.out.println("私の名前は " + name + " です。" + age + " 歳です。");
}
}
これは「Person クラス」=「人の設計図」です。まだ実物の人ではない点に注意してください。
main からオブジェクトを作って使う
次に、別のクラス(Main)からこの設計図を使ってオブジェクトを作ります。
// Main.java
public class Main {
public static void main(String[] args) {
// ── Person クラスから 2 つのオブジェクト(実物)を作成 ──
// new Person(...) で「設計図から実物を作って!」と命令
// コンストラクタが呼ばれて name, age がセットされる
Person sato = new Person("佐藤", 28); // 佐藤さん(28歳)を生成
Person tanaka = new Person("田中", 35); // 田中さん(35歳)を生成
// ── 各オブジェクトのメソッドを呼び出す ──
// オブジェクト名.メソッド名() の形でアクセス
sato.introduce(); // → 私の名前は 佐藤 です。28 歳です。
tanaka.introduce(); // → 私の名前は 田中 です。35 歳です。
}
}
1 行ずつ丁寧に解説
String name;
int age;
フィールド とは、クラスが「持つ情報」のこと。変数のクラス版 と理解すれば OK です。
public Person(String n, int a) {
name = n;
age = a;
}
コンストラクタ は、オブジェクトを新しく作るときに呼ばれる特別なメソッドです。 特徴:
- 名前がクラス名と同じ(
Person) - 戻り値の型を書かない(
voidすら書かない) - オブジェクトの初期化に使う
Person sato = new Person("佐藤", 28);
new Person(...): 「Person 設計図から実物を 1 つ作って」と命令- 作られた実物が
satoという変数に入る - このとき、コンストラクタが呼ばれ、
name = "佐藤"、age = 28がセットされる
sato.introduce();
sato.のように ドット(.) で、そのオブジェクトのメソッドにアクセスする- 「佐藤さんに自己紹介してね」という命令
this キーワード(超重要)
先ほどの例では、コンストラクタの引数名を n、a にしていました。
しかし実務では、フィールド名と同じ引数名にしたいことが多いです。そのときに使うのが this です。
public class Person {
String name;
int age;
// 引数名をフィールド名と同じにする
public Person(String name, int age) {
this.name = name; // フィールドの name = 引数の name
this.age = age;
}
}
| 書き方 | 意味 |
|---|---|
this.name | このオブジェクトのフィールド name |
name | 引数の(=ローカルの) name |
💡
thisは 「このオブジェクト自身」 を指す特別な言葉。コンストラクタやメソッドの中で、自分自身のフィールドにアクセスするときに使います。
アクセス修飾子(public と private)
ここまで public というキーワードが何度か出てきました。これは アクセス修飾子 と呼ばれ、「誰がアクセスしていいか」 を決めるものです。
| 修飾子 | 意味 |
|---|---|
public | 誰でもアクセス OK(他のクラスからも見える) |
private | このクラス内からのみアクセス OK(外からは見えない) |
実務では、フィールドは private、メソッドは public にするのが基本です。これは 「カプセル化(隠蔽)」 と呼ばれる、オブジェクト指向の重要な考え方です。
public class Person {
private String name; // 外から直接アクセス不可
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// ゲッター(値を取り出すメソッド)
public String getName() {
return name;
}
public int getAge() {
return age;
}
// 動作メソッド
public void introduce() {
System.out.println("私は " + name + " です。");
}
}
外側からは:
Person sato = new Person("佐藤", 28);
// sato.name = "山田"; // ❌ エラー(private なのでアクセス不可)
String n = sato.getName(); // ⭕ ゲッター経由なら OK
💡 なぜ private にする? 直接フィールドを変えられると、想定外の値(例:年齢に -100 を入れる)が入ってバグの原因になります。メソッド経由でしか変えられないようにすると、安全になります。
ハマりがちなエラー TOP3
エラー① クラス名とファイル名が違う
// ファイル名: Animal.java
public class Person { // ❌ ファイル名と一致していない
}
対処: public class Person を書くなら、ファイル名は Person.java にする。
エラー② new を忘れる
Person sato;
sato.introduce(); // ❌ null 参照エラー(NullPointerException)
対処: 必ず new Person(...) で実体を作ってから使う。
エラー③ クラス名は大文字始まりが慣習
public class person { ... } // ❌ 動くけど慣習違反
public class Person { ... } // ⭕ 正しい
対処: クラス名は アッパーキャメルケース(先頭大文字) が Java の慣習。
オブジェクト指向の真価:なぜクラスを使う?
ここまで読んで「メソッドだけでもよくない?」と思った方、するどいです。 クラスの真価は、規模が大きくなったときに発揮されます。
- データと処理がセットになっている → 関連する情報を一箇所にまとめられる
- 同じ設計図から複数のオブジェクトを作れる → 似たような処理を効率化
- 隠蔽(private)で安全に管理できる → バグが減る
- 継承で機能を拡張できる(発展編で学習)
編集部より
クラスとオブジェクトは、最初は「???」となりやすい概念ですが、「設計図と実物」のたとえさえ忘れなければ大丈夫。慣れれば呼吸するように書けるようになります!
練習問題
以下のクラスを作ってみましょう。
商品を表す
Productクラス を作ります。
- フィールド:
name(String)、price(int)- コンストラクタ: 2 つの値を受け取って初期化
- メソッド:
showInfo()で「商品名: ○○ / 価格: ○○円」を表示
main メソッドから 2 つの商品オブジェクトを作って表示してください。
解答例
// Product.java
public class Product {
// ── フィールドは private(外から直接いじれないようにする = カプセル化) ──
private String name; // 商品名
private int price; // 価格(円)
// ── コンストラクタ:商品オブジェクトを作るときに名前と価格を受け取る ──
public Product(String name, int price) {
this.name = name; // this.name = フィールドの name / name = 引数の name
this.price = price; // this を付けないとどちらも引数を指してしまうので注意
}
// ── 商品情報を表示するメソッド ──
public void showInfo() {
System.out.println("商品名: " + name + " / 価格: " + price + "円");
}
}
// Main.java
public class Main {
public static void main(String[] args) {
Product apple = new Product("りんご", 150);
Product bread = new Product("パン", 280);
apple.showInfo(); // 商品名: りんご / 価格: 150円
bread.showInfo(); // 商品名: パン / 価格: 280円
}
}
まとめ
第 7 回では、以下を学びました。
- ✅ クラスは「設計図」、オブジェクトは「設計図から作られた実物」
- ✅ フィールド = クラスが持つデータ、メソッド = クラスができる動作
- ✅ コンストラクタでオブジェクトを初期化する
- ✅
newキーワードでオブジェクトを生成する - ✅
thisは「このオブジェクト自身」を指す - ✅
privateでフィールドを隠蔽、publicメソッドで安全にアクセス
次回は、プログラムが 「エラーで突然落ちないように守る」 ための 例外処理(try-catch) を学びます。 実務で必須の重要トピックです。お楽しみに!