Java基礎 第8回でメソッドについて学習してきました。
本記事は、オブジェクト指向プログラミング言語Javaにおける基本的な概念である「クラス」と「オブジェクト」の理解を深めるためのものです。
記事では、Javaのクラスとオブジェクトの役割と基本的な概念を順に説明し、それらがどのようにプログラムの設計図を作り、動的な動作を生成するのかについて詳しく解説します。具体的なコード例も豊富に取り上げられており、クラスとオブジェクトの定義、フィールドとメソッドの設定、そしてそれらを利用したオブジェクトの生成と操作を学ぶことができます。
この記事は、Javaや他のオブジェクト指向プログラミング言語を学んでいる初心者、または基本的な概念の再確認をしたい中級者にとって役に立つ内容です。
オブジェクト指向の重要性と、その中でのクラスとオブジェクトの役割
Javaはオブジェクト指向プログラミング言語の一つであり、その中心的な概念である「クラス」と「オブジェクト」を理解することは、Javaプログラミングの基本となります。
クラスは設計図のようなもので、具体的なデータ(フィールド)や操作(メソッド)が定義されます。そして、この設計図に基づいて生成される実体がオブジェクトです。ここでは、これらの概念について順を追って説明していきます。
クラスの基本概念と定義
クラスとは、オブジェクトの設計図であり、その中にはデータ(フィールド)と処理(メソッド)が定義されます。クラスを定義することで、それを基にした新たなオブジェクトを生成することができます。
クラスの定義
クラスの定義は、一般的には以下のステップで行います
- 「class」キーワードを使用して、新たなクラスを定義します。
- クラス名を定義します。クラス名は大文字で始まることが一般的です(これはJavaの命名規約に従っています)。
- クラスの本体を波括弧「{}」で囲みます。クラスの本体の中には、このクラスのフィールドとメソッドを定義します。
例えば、犬をモデルにした「Dog」クラスを定義してみましょう。
public class Dog {
// フィールド
String name; // 名前
int age; // 年齢
// メソッド
void bark() {
System.out.println(name + "が吠えています:ワンワン!");
}
}
このコードでは、「Dog」というクラスを定義しています。「class」キーワードの後にクラス名「Dog」を指定し、その後の波括弧「{}」の中にフィールド「name」、「age」とメソッド「bark」を定義しています。
フィールドは、クラスやそのクラスから生成されたオブジェクトが持つデータを定義します。メソッドは、そのクラスのオブジェクトが実行できる操作を定義します。つまり、「Dog」クラスとは「名前」と「年齢」を持ち、「吠えることができるもの」という設計図となります。
以上のように、クラスを定義することでオブジェクトの型や振る舞いを設計し、これを基に多数のオブジェクトを生成することができます。
オブジェクトの基本概念と生成
オブジェクトとは、クラスの設計図から作られる実体です。これは「インスタンス化」とも言われます。
Javaでは「new」キーワードを用いてクラスからオブジェクトを生成します。
// Dogクラスからオブジェクトを生成(インスタンス化)
Dog myDog = new Dog();
// オブジェクトのフィールドに値を設定
myDog.name = "Max";
myDog.age = 5;
このコードでは、「Dog」クラスから「myDog」オブジェクトを生成し、「name」フィールドに「Max」、「age」フィールドに「5」を設定しています。この「myDog」は、自身の「name」と「age」を持ち、自身で「bark」することができる犬を表現しています。
同じクラスから生成されたオブジェクトでも、それぞれが異なる値を持つことができます。例えば、もう一つ犬のオブジェクトを作ってみましょう。
// 新たにDogクラスからオブジェクトを生成(インスタンス化)
Dog yourDog = new Dog();
// オブジェクトのフィールドに値を設定
yourDog.name = "Bella";
yourDog.age = 3;
ここで生成された「yourDog」もまた、「Dog」クラスから生成された別のオブジェクトですが、「name」は「Bella」、「age」は「3」と、「myDog」とは異なる値を持っています。
メソッドの定義と利用
メソッドとは、ある特定の処理を行うためのコードのまとまりであり、クラス内で定義します。メソッドを定義することで、そのクラスから生成された全てのオブジェクトがそのメソッドを利用できます。それでは、犬を表す「Dog」クラスに吠えるという行動を表す「bark」メソッドを定義し、その利用例を見てみましょう。
public class Dog {
// フィールド定義
String name;
// メソッド定義
void bark() {
System.out.println(name + "が吠えています:ワンワン!");
}
}
// Dogクラスから2つのオブジェクトを生成します
Dog myDog = new Dog();
Dog yourDog = new Dog();
// それぞれのオブジェクトに異なる値を設定します
myDog.name = "マックス";
yourDog.name = "ベラ";
// myDogオブジェクトのbarkメソッドを呼び出します
myDog.bark(); // 出力:マックスが吠えています:ワンワン!
// yourDogオブジェクトのbarkメソッドを呼び出します
yourDog.bark(); // 出力:ベラが吠えています:ワンワン!
上記のコードでは、「myDog」と「yourDog」という2つのオブジェクトから「bark」メソッドを呼び出しています。「myDog.bark()」は「マックスが吠えています:ワンワン!」、「yourDog.bark()」は「ベラが吠えています:ワンワン!」と出力します。
これらの例からわかるように、オブジェクトがメソッドを呼び出す際、オブジェクト自身が持っているフィールドの値(ここでは「name」の値)が、メソッドの動作に影響を与えます。
クラスとオブジェクトの基本的な操作
クラスとオブジェクトを用いて基本的な操作を行う方法について詳しく説明します。これには、オブジェクトの生成、フィールドへのアクセスと設定、メソッドの呼び出しが含まれます。それぞれのオブジェクトは自身のフィールド値を持ち、それに基づいた振る舞い(メソッド)を行うことができます。
例えば、「Car」クラスから生成した複数のオブジェクトがそれぞれ異なる動作を行う様子を考えてみましょう
public class Car {
// フィールド定義
String color;
String brand;
// メソッド定義
void drive() {
System.out.println(color + "色の" + brand + "が走行中です!");
}
}
// Carクラスから2つのオブジェクトを生成します
Car car1 = new Car();
Car car2 = new Car();
// それぞれのオブジェクトに異なる値を設定します
car1.color = "赤";
car1.brand = "トヨタ";
car2.color = "青";
car2.brand = "ホンダ";
// それぞれのオブジェクトでdriveメソッドを呼び出します
car1.drive(); // 出力:赤色のトヨタが走行中です!
car2.drive(); // 出力:青色のホンダが走行中です!
この例では、「car1」オブジェクトと「car2」オブジェクトは同じ「Car」クラスから生成されていますが、それぞれ異なるフィールド値(色とブランド)を持っています。そして、それぞれのオブジェクトが「drive」メソッドを呼び出すと、そのフィールド値に基づいたメッセージが出力されます。これにより、オブジェクトごとに異なる振る舞いが可能となることが示されています。
まとめ
今回はクラスとオブジェクトについて紹介しました。
抽象的な範囲の内容となってきており、少し難しくなってきているかもしれません。
オブジェクト指向におけるオブジェクトの考え方は、日常生活に紐づけて考えると理解しやすいかもしれません。
今回例で出しているもの以外に、自分でも想定してイメージしてみるのもいいかもしれません。
次回はコンストラクタについて紹介していきます。
コメント