1. クラスとオブジェクトとは
たとえ話から始めましょう。車の設計図を思い浮かべてください。設計図には車にタイヤが4つあること、エンジン、色、座席などが記されています。しかし設計図そのものは道路を走らず、エンジン音もせず、ガソリンも要りません。これは、車の仕組みを記述したものにすぎません。
クラスはプログラミングにおける同様の「設計図」(テンプレート)で、インスタンスが持つデータ(フィールド)と振る舞い(メソッド)を定義します。
オブジェクトは、その設計図から組み立てられた「実物」、すなわち具体的なインスタンスです。各オブジェクトは独自の状態(たとえば、ある車は赤、別の車は青)を持ち、クラスで定義された振る舞い(走る、ブレーキをかける、クラクションを鳴らす など)を実行できます。
身近な例
- クラス: 人 (Person) — 人は名前・年齢・身長を持ち、話す・走るといったことができるという説明。
- オブジェクト: Vasya、Petya、Katya — 具体的な人たちで、各自が固有の名前や年齢を持つ。
| クラス | オブジェクト 1 | オブジェクト 2 |
|---|---|---|
|
|
|
なぜクラスが重要か?
- 関連する変数とメソッドをひとまとめにできる。
- 同じ構造でデータの異なるオブジェクトをいくつでも作成できる。
- 「銀行口座」「商品」「本」「ユーザー」など、複雑な実体を簡潔に表現できる。
2. クラス宣言の構文
Java では、キーワード class を使ってクラスを宣言します。続けてクラス名(慣例として先頭は大文字)、そして波かっこを書き、その内側にフィールドとメソッドを記述します。
最も簡単な例
public class Person {
// フィールドとメソッドはここに書く
}
解説:
- public — アクセス修飾子。
- class — コンパイラに「クラスを宣言する」と伝える。
- Person — クラス名(自分で決めるが、先頭は大文字)。
クラス名の重要なルール
- クラス名は先頭を大文字にする(例: Car, Account, Book)。
- クラス名には空白や特殊文字は使えない。例外はアンダースコア(_)と $(ただしこれはまれ)。
- 名前が複数の単語から成る場合は CamelCase を使う: BankAccount, BookStore。
クラスはどこに書く?
クラスは別ファイルに宣言できます(通常は 1 ファイル 1 クラス)。また、別のクラスの内側に宣言することもできます(ネストされたクラスについては後述)。
例: ファイル Person.java:
public class Person {
// フィールドとメソッド
}
3. クラスのフィールドとメソッド(概要)
今はクラスを宣言しただけで、まだ中身は空の箱のようなものです。そこに「属性」(フィールド)と「動作」(メソッド)を追加しましょう。
フィールド(クラス内の変数)
フィールドは、そのクラスの各オブジェクトが持つデータを表します。
public class Person {
String name; // 人の名前
int age; // 年齢
}
メソッド(クラス内の関数)
メソッドは、オブジェクトが何をできるかを記述します。
public class Person {
String name;
int age;
void sayHello() {
System.out.println("こんにちは、私の名前は " + name + " です!");
}
}
解説:
- void — 値を返さない(戻り値については後で説明)。
- sayHello() — メソッド名。丸かっこは必須。
- メソッド内部からクラスのフィールド(たとえば name)にアクセスできる。
4. オブジェクトの生成
いよいよ本番です! 設計図から「実物」を作るには、キーワード new を使います。
オブジェクト生成の構文
Person vasya = new Person();
- Person — 変数の型(私たちのクラス)。
- vasya — 変数名(任意に決めてよい)。
- new Person() — Person 型の新しいオブジェクトを生成。
これで、vasya という変数が、Person クラスのオブジェクトを参照するようになりました。このオブジェクトにはそれ自身のフィールドとメソッドがあります。
フィールドとメソッドへのアクセス
ドット演算子でアクセスします:
vasya.name = "Vasya";
vasya.age = 25;
vasya.sayHello(); // 出力: こんにちは、私の名前は Vasya です!
オブジェクトはいくつでも作成できる
Person petya = new Person();
petya.name = "Petya";
petya.age = 30;
petya.sayHello(); // こんにちは、私の名前は Petya です!
各オブジェクトは自分自身のデータを持つ独立した「コピー」です。
5. これまでの内容との関連
これまでは、main メソッドのあるクラスの中に直接変数やメソッドを書いており、自分の型を作ることは考えていませんでした。これからは、自分専用の「データと関数の入れ物」を作れます。
これは大きな可能性を開きます。課題に登場するあらゆる実体(顧客、商品、口座、注文、動物、車 など)を表現できます。プログラムはより構造化され、読みやすく、拡張しやすくなります。
例: 初めての自作クラス
ミニプログラム用に簡単なクラスを書いてみましょう。たとえば「銀行口座」(BankAccount)。この例はコースの進行に合わせて発展させていきます。
public class BankAccount {
String owner; // 口座の所有者
int balance; // 口座残高
void printInfo() {
System.out.println("所有者: " + owner + "、残高: " + balance + " ユーロ。");
}
}
次に、プログラムを起動するために必要な main メソッドで、このクラスのオブジェクトを作成できます:
public class Main {
public static void main(String[] args) {
BankAccount account1 = new BankAccount();
account1.owner = "Ivan";
account1.balance = 1000;
account1.printInfo(); // 所有者: Ivan、残高: 1000 ユーロ。
BankAccount account2 = new BankAccount();
account2.owner = "Maria";
account2.balance = 2000;
account2.printInfo(); // 所有者: Maria、残高: 2000 ユーロ。
}
}
注意: 各オブジェクトはそれぞれのフィールド値を持ちます。account1 の残高を変更しても、account2 には影響しません。
ビジュアル図: クラスとオブジェクト
graph TD
subgraph Class
Person["Class Person | name:String | age:int | sayHello()"]
end
subgraph Objects
vasya["vasya : Person | name = 'Vasya' | age = 20"]
petya["petya : Person | name = 'Petya' | age = 25"]
end
vasya --> Person
petya --> Person
解説:
- Person — クラス(テンプレート)。
- vasya と petya — そのテンプレートから作られたオブジェクト(インスタンス)。
6. クラス宣言やオブジェクト生成で陥りやすいミス
エラー No. 1: クラス名を小文字で始めてしまう。
Java では(コンパイラはエラーにしませんが、経験豊富な開発者は皆指摘します)クラス名は先頭を大文字にする慣習です。class person と書かずに、class Person と書きましょう。
エラー No. 2: 波かっこを付け忘れる。
クラス本体は必ず波かっこで囲む必要があります。
public class Person // エラー!
String name;
正しい例:
public class Person {
String name;
}
エラー No. 3: オブジェクトを作らずにインスタンスのフィールド/メソッドへアクセスしようとする。
メソッドやフィールドが static として宣言されていない場合、オブジェクト経由でのみアクセスできます:
Person.sayHello(); // エラー!
正しい例:
Person vasya = new Person();
vasya.sayHello();
エラー No. 4: public クラスで、ファイル名とクラス名が一致しない。
クラスが public として宣言されている場合、ファイル名はクラス名と一致していなければなりません:
// ファイル Person.java
public class Person { ... }
ファイル名が異なると、コンパイラはエラーを出します。
エラー No. 5: オブジェクトを初期化せずにインスタンスのフィールドを使う。
クラスのフィールド(static でないもの)はクラスそのものではなくオブジェクトに属します。
GO TO FULL VERSION