Javaはオブジェクト指向プログラミング(OOP)を基盤とした言語であり、その中心にあるのがクラスとオブジェクトの概念です。オブジェクト指向の特徴は、現実世界をモデルにした「オブジェクト」という単位でデータとその処理を管理することにあります。この章では、Javaのオブジェクト指向プログラミングの基礎となるクラスとオブジェクトについて学びます。
具体的には、以下のトピックをカバーします:
- クラスとオブジェクトの基本
- フィールド(インスタンス変数)とメソッド(インスタンスメソッド)
- コンストラクタ
- thisキーワード
- クラスメンバーとインスタンスメンバー
- ガベージコレクション(GC)の仕組み
6.1 クラスとオブジェクトとは?
クラスは、オブジェクトを作成するための「設計図」とも言えます。クラスには、オブジェクトが持つべき属性(データ)と振る舞い(メソッド)が定義されています。このクラスに基づいて作成される実体がオブジェクトです。オブジェクトは、クラスで定義された属性とメソッドを具体的に持つ実際のデータです。
6.1.1 クラスの定義
Javaでクラスを定義するための基本的な構文は次の通りです。
public class クラス名 {
// フィールド(属性)
// メソッド(振る舞い)
}
クラス名は通常、大文字で始め、各単語の先頭を大文字にする「キャメルケース」で命名します。以下は、Person
というクラスの定義例です。
public class Person {
String name; // 名前
int age; // 年齢
// メソッド(振る舞い)
public void introduce() {
System.out.println("私の名前は " + name + " です。年齢は " + age + " 歳です。");
}
}
このクラスは、人を表す属性として名前と年齢(フィールド)を持ち、自己紹介を行うメソッドを持っています。
6.1.2 オブジェクトの生成
クラスが定義されたら、そのクラスからオブジェクトを生成することができます。オブジェクトを生成するためにはnew
キーワードを使います。
Person person1 = new Person();
ここで、person1
はPerson
クラスから作られたオブジェクトです。new
キーワードはメモリにオブジェクトを作成し、そのオブジェクトの参照を変数person1
に代入します。
6.1.3 オブジェクトの使用
生成したオブジェクトに対しては、そのクラスで定義されたフィールドやメソッドにアクセスできます。次の例では、Person
オブジェクトのフィールドに値を代入し、メソッドを呼び出します。
public class Main {
public static void main(String[] args) {
Person person1 = new Person();
person1.name = "太郎";
person1.age = 25;
person1.introduce(); // メソッドの呼び出し
}
}
実行結果は次のようになります。
コードをコピーする私の名前は 太郎 です。年齢は 25 歳です。
6.2 フィールド(インスタンス変数)とメソッド(インスタンスメソッド)
オブジェクト指向プログラミングでは、クラスの中にフィールド(属性)とメソッド(振る舞い)を定義します。オブジェクトが持つデータがフィールド、オブジェクトが行う処理がメソッドです。
6.2.1 フィールド(インスタンス変数)
フィールドは、オブジェクトが持つデータを保持するための変数です。Javaでは、フィールドはクラス内に定義され、オブジェクトごとに固有の値を持つことができます。
public class Car {
String model; // モデル名
int year; // 製造年
}
上記のCar
クラスでは、各オブジェクトがモデル名と製造年を持つことができます。
6.2.2 メソッド(インスタンスメソッド)
メソッドは、オブジェクトが実行する処理の定義です。メソッドはクラス内に定義され、オブジェクトごとに実行される処理を記述します。
public void startEngine() {
System.out.println("エンジンが始動しました。");
}
上記のstartEngine
メソッドは、Car
クラスに追加できる処理の一つです。
6.3 コンストラクタ
コンストラクタは、クラスのオブジェクトを生成する際に呼び出される特別なメソッドです。コンストラクタは通常、オブジェクトの初期化を行います。Javaでは、クラスと同じ名前のメソッドがコンストラクタになります。
6.3.1 コンストラクタの定義
コンストラクタの基本的な定義は次の通りです。
public クラス名(引数リスト) {
// 初期化処理
}
次の例は、Person
クラスにコンストラクタを追加したものです。このコンストラクタは、オブジェクト生成時に名前と年齢を設定するために使用されます。
public class Person {
String name;
int age;
// コンストラクタ
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("私の名前は " + name + " です。年齢は " + age + " 歳です。");
}
}
6.3.2 コンストラクタの呼び出し
オブジェクトを生成する際に、コンストラクタに引数を渡すことで、オブジェクトを初期化します。
public class Main {
public static void main(String[] args) {
Person person1 = new Person("太郎", 25);
person1.introduce();
}
}
実行結果:
コードをコピーする私の名前は 太郎 です。年齢は 25 歳です。
6.4 thisキーワード
Javaでは、this
キーワードを使って、現在のオブジェクトを参照することができます。通常、this
はコンストラクタやメソッド内で使われ、インスタンス変数やメソッドにアクセスする際に使用されます。
6.4.1 thisの使用例
次の例では、コンストラクタ内でthis
を使って、パラメータとインスタンス変数を区別しています。
public class Person {
String name;
int age;
// コンストラクタ
public Person(String name, int age) {
this.name = name; // thisを使ってインスタンス変数を参照
this.age = age;
}
public void introduce() {
System.out.println("私の名前は " + name + " です。年齢は " + age + " 歳です。");
}
}
this.name
は、オブジェクトのインスタンス変数name
を指し、name
だけの場合はコンストラクタのパラメータを指します。
6.5 クラスメンバーとインスタンスメンバー
Javaでは、クラスにはインスタンスメンバーとクラスメンバーの2種類のメンバーが存在します。インスタンスメンバーは、各オブジェクトごとに異なる値を持つことができますが、クラスメンバーは全てのオブジェクト間で共有されます。
6.5.1 インスタンスメンバー
インスタンスメンバーは、各オブジェクトごとに異なるデータを保持するフィールドやメソッドです。これまで紹介してきたフィールドやメソッドは、すべてインスタンスメンバーです。
6.5.2 クラスメンバー(静的メンバー)
クラスメンバーは、クラス全体に関連するデータや処理を定義します。クラスメンバーを定義するには、static
キーワードを使用します。クラスメンバーは、クラスがロードされた時点でメモリに割り当てられ、全てのオブジェクト間で共有されます。
次の例では、Person
クラスにstatic
メンバーを追加しています。
public class Person {
String name;
int age;
static int population = 0; // クラスメンバー
// コンストラクタ
public Person(String name, int age) {
this.name = name;
this.age = age;
population++; // 人口カウントを増加
}
public static void showPopulation() {
System.out.println("人口は " + population + " 人です。");
}
}
クラスメンバーは、クラス名を使って直接呼び出すことができます。
public class Main {
public static void main(String[] args) {
Person person1 = new Person("太郎", 25);
Person person2 = new Person("花子", 22);
Person.showPopulation(); // クラスメンバーの呼び出し
}
}
実行結果:
人口は 2 人です。
6.6 ガベージコレクション(GC)
Javaでは、不要になったオブジェクトを自動的にメモリから解放する仕組みが備わっています。これを**ガベージコレクション(GC)**と呼びます。ガベージコレクションは、開発者がメモリ管理を手動で行う必要がないため、メモリリークのリスクを減らし、プログラムの安全性を向上させます。
6.6.1 ガベージコレクタの動作
Javaのガベージコレクタは、メモリ上で参照されなくなったオブジェクトを自動的に検出し、それらを回収してメモリを解放します。プログラマが明示的に解放処理を行う必要はありません。
6.6.2 ガベージコレクションの仕組み
例えば、以下のように一度作成したオブジェクトをその後参照しなくなった場合、そのオブジェクトはガベージコレクタによって回収されます。
public class Main {
public static void main(String[] args) {
Person person = new Person("太郎", 25);
person = null; // オブジェクトへの参照を切る
// ここで、personオブジェクトはガベージコレクションの対象になる
}
}
6.7 クラスとオブジェクトまとめ
この章では、オブジェクト指向プログラミングの中心であるクラスとオブジェクトの基本的な概念と、その使い方を学びました。フィールドやメソッド、コンストラクタ、this
キーワード、クラスメンバーとインスタンスメンバーの違い、さらにJavaのガベージコレクションの仕組みについても解説しました。これらの知識は、Javaプログラムをオブジェクト指向的に設計し、コードの再利用性とメンテナンス性を向上させるための基盤となります。
次章では、Javaの配列について詳しく学び、複数のデータを効率的に扱う方法を探っていきます。