オブジェクト指向が分からない人は多いです。
オブジェクト指向を理解するためには、基本的なオブジェクトの使い方を知ることが大事です。
この記事を読めば、基本的なオブジェクトの使い方が分かるようになります。
オブジェクト指向とは
オブジェクト指向とは、「考え方」のことです。
どのような考え方かというと効率的なプログラミングをするための「考え方」です。
オブジェクト指向について学ぶためには、まずはオブジェクトが何かを知らないことには始まりませんよね。
まずはオブジェクトが何かを知りましょう。
オブジェクトの基本的な使い方
クラスでオブジェクトを定義する方法
オブジェクトとは、モノや物体という意味です。
物体には、人間も含まれます。
オブジェクト指向のプログラミングでは、このオブジェクト(モノ)を定義(設計)し、生成して利用していきます。
まずはサンプルのソースコードを見てオブジェクトについて学びましょう。
public class Human {
//フィールド
private int hp;
private String name;
// メソッド
/********************************************/
//statusメソッド
// 処理:名前、HP、MPを表示
public void status() {
System.out.printf("名前:%s\tHP:%d\n",name,hp);
}
}
「Human.java」というファイルに、Humanクラスを作成しました。
これはHuman(人間)というオブジェクトの設計図です。
クラスとは、オブジェクトやプログラムの設計図を書くものです。
クラスには2つ必要なものがあります。
1.フィールド
2.メソッド
人間には体力や名前などの要素がありますが、それをフィールドとして定義しました。
フィールドは、クラス内で宣言され、オブジェクトの状態を表現するために使用される変数です。
フィールドの変数は基本的にprivateで設定し、外部から直接アクセスできなくします。アクセスするためには、メソッドを通じて間接的にアクセスできるようにします。
そして人間は動作をすることもでき、自分の名前と体力を表すことができるようにメソッドを定義しました。
オブジェクトの設計図であるクラスにはmainメソッドは書かない
Humanクラスには「public static void main(String[] args)」が書かれていません。
オブジェクトの設計図を書くためのファイルに「public static void main(String[] args)」を書く必要はありません。
「public static void main(String[] args)」はエントリーポイントと言って、プログラムの開始点になります。このmainメソッドの中で様々な処理が実際に行われます。
「public static void main(String[] args)」と書かれているクラスで、Humanクラスを利用することが出来ます。
オブジェクトを生成する方法(インスタンス化)
public class Buttle {
public static void main(String[] args) {
// Humanクラスのインスタンスを生成(インスタンス化)
// インスタンスとはオブジェクトの実体のこと
Human HumanA = new Human();
}
}
「Buttle.java」というファイルに、Buttleクラスを作成しました。
Buttleクラスには、mainメソッドがあるため、このクラスにはオブジェクトの設計図は書かず、実際に実行する処理を書いていきます。
mainメソッドがあるクラスは、実際に実行するプログラムの設計図といえます。
mainメソッド内で、Humanクラス(Humanというオブジェクトの設計図)からHumanAを生成します。
このようにクラスからオブジェクトの実体を生成することをインスタンスを生成すると言います。
インスタンスのメソッドを使用する方法
public class Buttle {
public static void main(String[] args) {
// Humanクラスのインスタンスを生成(インスタンス化)
// インスタンスとはオブジェクトの実体のこと
Human HumanA = new Human();
HumanA.status();
HumanA.status();
}
}
実行結果
次のところで違いが分かりやすいように、あえて2回表示しています。
生成されたインスタンスHumanAのメソッドを使いたい場合、「HumanA.status();」と書きます。
その他にメソッドがある場合も同様です。
今回は、インスタンスの変数(nameとhp)に値を入れていないので、nullと0が表示されました。
インスタンス変数に値を代入する方法
public class Human {
//フィールド
private int hp;
private String name;
// メソッド
/********************************************/
//statusメソッド
// 処理:名前、HP、MPを表示
public void status() {
System.out.printf("名前:%s\tHP:%d\n",name,hp);
}
// アクセサメソッド set
public void setHp(int hp) {
this.hp = hp;
}
public void setName(String name) {
this.name = name;
}
}
Humanクラスにアクセサメソッドという、フィールドの変数にアクセスするためのメソッドを作成しました。
メソッドの引数がフィールドの変数名と同じ場合、thisを変数名の前に付けることで、フィールドの変数名とメソッドの引数を区別することができます。
public class Buttle {
public static void main(String[] args) {
// Humanクラスのインスタンスを生成(インスタンス化)
// インスタンスとはオブジェクトの実体のこと
Human HumanA = new Human();
HumanA.status();
HumanA.setHp(100);
HumanA.setName("斎藤");
HumanA.status();
}
}
出力結果
メソッドsetHpとsetNameを使うことで、インスタンス変数に値を代入することができています。
コンストラクタの使い方|インスタンス生成時に初期化する方法
public class Human {
//フィールド
private int hp;
private String name;
// メソッド
/********************************************/
/**
* コンストラクタ
* @param name 名前
* @param hp 体力
*/
public Human(String name, int hp) {
this.name = name;
this.hp = hp;
}
//statusメソッド
// 処理:名前、HP、MPを表示
public void status() {
System.out.printf("名前:%s\tHP:%d\n",name,hp);
}
}
コンストラクタとは、インスタンス生成時に使うことができるメソッドのことです。基本的に初期化に使用されます。
コンストラクタのメソッド名はクラス名を使用します。
メソッドの上に書かれているのは、javadoc(コメント機能)というものでメソッドに関する説明を書くことができます。
VSCODEでは、/**と入力し、EnterまたはTabを押すと表示されます。
public class Buttle {
public static void main(String[] args) {
// Humanクラスのインスタンスを生成(インスタンス化)
// インスタンスとはオブジェクトの実体のこと
Human HumanA = new Human("近藤", 100);
HumanA.status();
}
}
出力結果
コンストラクタは、インスタンス生成時に機能してくれるので、「this.HumanA」と書く必要はありません。
コンストラクタを書いておくと、インスタンス生成時に引数に値を指定できます。
先ほど、「Human.java」にjavadoc(コメント機能)を追加しましたが、これを書くと「Buttle.java」で補足説明が表示されます。
これは「new Human」のHumanにカーソルを合わせている状態です。
このようにカーソルを合わせるとメソッドに関する引数等の情報が表示されます。
javadocを書いておくと、より分かりやすいソースコードになります。
練習問題
public class Pokemon {
// メンバ変数
private String name;
private int damage;
// コンストラクタ
public Pokemon(String name, int damage) {
this.name = name;
this.damage = damage;
}
// attackメソッド
public void attack(Pokemon target) {
System.out.println(this.name + "は、" + target.name + "に" + this.damage + "のダメージを与えた!");
}
public static void main(String[] args) {
// オブジェクトを2つ生成して初期化
Pokemon pikachu = new Pokemon("ピカチュウ", 30);
Pokemon charmander = new Pokemon("ヒトカゲ", 25);
// attackメソッドを呼び出してダメージを表示
pikachu.attack(charmander);
}
}