17. インスタンスメソッド

インスタンスメソッド

クラスメソッドとは

OOPのメソッドは「歩く」「話す」「戦う」といった、オブジェクトの動作や振る舞いのことを指します。クラスメソッドは、クラス内に定義したメソッドのことを指します。

メソッドの例

項目 メソッド 備考
歩く walk スピード、方向などでキャラクターを移動する
話す talk 内容、相手などを指定して会話する
攻撃する attack キャラクターの能力、武器などから、相手に攻撃する

インスタンスメソッドとは

クラスインスタンスで実行できるメソッドをインスタンスメソッドといいます。

インスタンスメソッドの定義

インスタンスメソッドは「修飾子」「メソッド名」「データ型」でクラス内に定義します。

public class クラス名 {
    //インスタンスメソッド
    修飾子 データ型 メソッド名() {

    }
}

自分のクラスのフィールドにアクセス

インスタンスが生成されるとフィールドにアクセスできますが、自分のインスタンスメソッド内では、thisでアクセスできます。

this.フィールド名

インスタンスメソッドの基本

インスタンスメソッドの定義

Characterクラスにインスタンスメソッドを定義します。

項目 メソッド名 引数 戻り値型 アクセス修飾子
歩く walk String direction void public
話す talk Character character, String message void public
攻撃する attack Character character void public

インスタンスメソッドの実装

Characterクラスに walk() メソッドを実装します。

Character.java
package rpg;

public class Character {

	public String name;
	public String job;
	public int hp;

	public void walk(String direction) {
		String message = this.name + " move " + direction;
		System.err.println(message);
	}

}

staticメソッドではアクセスできない

walk() を staticメソッドで定義した場合は、thisでアクセスできません。staticはインスタンスに関係なく動作する仕様なのでコンパイルエラーになります。

//staticメソッドの場合は、コンパイルエラー
public static void walk() {
	String message = this.name + " move to " + direction;
	System.out.println(message);
}

インスタンスメソッドの実行

インスタンスメソッドはインスタンスで実行します。 staticメソッドではないので、メソッド名で直接実行できません

インスタンス.メソッド名();

メインメソッドで実行

「wizard」インスタンスでインスタンスメソッドを実行します。

package rpg;

public class App {

	public static void main(String[] args) {
		Character wizard = new Character();
		wizard.name = "アリス";
		wizard.job = "wizard";
		wizard.hp = 30;

        //wizardインスタンスでインスタンスメソッドを実行
		wizard.walk("left");
	}

}
結果

「App.java」を実行して、インスタンスメソッドの実行を確認してみましょう。

アリス move left

インスタンスと引数

インスタンスを引数で渡す

インスタンスそのものを、メソッドの引数に渡すことができます。

talk() メソッドの実装

「Characterオブジェクト」と「文字列」を引数にした、talk() メソッドを定義します。

Character.java
public class Character {
	...

	public void talk(Character character, String message) {
		message = character.name + "!"+ message;
		System.out.println(message);
	}

}

talk() メソッドの実行

「App.java」のメインメソッドで新しいキャラクター「warrior」を作成し、talk() メソッドに渡してみましょう。

App.java
public class App {

	public static void main(String[] args) {
		...
		wizard.walk("left");

        //warriorインスタンスを生成
		Character warrior = new Character();
		warrior.name = "ボブ";
		warrior.job = "warrior";
		warrior.hp = 50;

        //talkメソッドを実行
		wizard.talk(warrior, "勝負しましょう!");
	}

}
結果
アリス move to left
ボブ!勝負しましょう!

インスタンスの参照

インスタンスはメモリーに保持

インスタンスはJavaのメモリーに状態を保持され、このインスタンスのメモリの場所を表す値を参照といいます。インスタンスが別のファイルで処理されたとしても、その状態は常に保持されます。

attack() メソッドの実装

attack() メソッドを実装し、引数で渡された Characterオブジェクトの「hp」を計算します。ここでは、damage変数の値だけ引き算しました。

Character.java
public class Character {
	...

	public void attack(Character character) {
		int damage = 1;
		character.hp -= damage;
	}

}

attack() メソッドの実行

attack() メソッドに「warrior」オブジェクトを渡して実行します。これは「wizard」が「warrior」に攻撃することを意味します。

App.java
public class App {

	public static void main(String[] args) {
		...

		Character warrior = new Character();
		warrior.name = "ボブ";
		warrior.job = "warrior";
		warrior.hp = 50;

        //攻撃前のwarriorのHP
        System.out.println(warrior.hp);
        //wizardがwarriorに攻撃
        wizard.attack(warrior);
        //攻撃後のwarriorのHP
        System.out.println(warrior.hp);
	}

}
結果

「warrior」オブジェクトの「hp」の数値が変化しました。

アリス move to left
ボブ!勝負しましょう!
50
49

ソース

Character.java
package rpg;

public class Character {

	public String name;
	public String job;
	public int hp;

	public void walk(String direction) {
		String message = this.name + " move " + direction;
		System.out.println(message);
	}

	public void talk(Character character, String message) {
		message = character.name + "!"+ message;
		System.out.println(message);
	}

	public void attack(Character character) {
		int damage = 1;
		character.hp -= damage;
	}

}
App.java
package zoo;

public class Animal {

	public String type;
	public String name;
	public String crying;
	
	public Animal(String type, String name, String crying) {
		super();
		this.type = type;
		this.name = name;
		this.crying = crying;
	}

	public void walk() {
		String message = this.name + "が歩いた";
		System.out.println(message);
	}

	public void cry() {
		System.out.println(this.crying);
	}

	public void escape() {
		String message = this.name + "が逃げた";
		System.out.println(message);
	}
}

演習

つぎのプログラムをみて回答してください。

Animal.java
package zoo;

public class Animal {

	public String type;
	public String name;
	public String crying;
	
	public void walk() {
		String message = this.name + "が歩いた";
		System.out.println(message);
	}

	public void cry() {
		System.out.println(this.crying);
	}

	public void escape() {
		String message = this.name + "が逃げた";
		System.out.println(message);
	}
}
AnimalApp.java
package zoo;

public class AnimalApp {

	public static void main(String[] args) {
		Animal dog = new Animal();
        dog.type = "dog";
        dog.name = "ポチ";
        dog.name = "わん!";

		Animal cat = new Animal();
        cat.type = "cat";
        cat.name = "ミケ";
        cat.name = "にゃー!";

		dog.walk();
		dog.cry();
		cat.cry();
		cat.escape();
	}

}

問題1

Animal.java の walk() のことを何といいますか?

1)staticメソッド

2)フィールド

3)インスタンス

4)インスタンスメソッド

問題2

「AnimalApp.java」を実行した結果はどれですか?

1)わん! ポチが歩いた にゃー!

2)わん! ポチが歩いた にゃー! ミケが逃げた

3)ポチが歩いた わん! にゃー!ミケが逃げた

4)ポチが歩いた わん! ミケが逃げた