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 to " + direction;
		System.err.println(message);
	}

}

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

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

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

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

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

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

メインメソッドで実行

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

	public static void main(String[] args) {
		Character wizard = new Character();
		...
		//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 static void main(String[] args) {
		...

		//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 = 5;
		character.hp -= damage;
	}

}

attack() メソッドの実行

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

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の数値が変化しました。

結果
...
ボブ!勝負しましょう!
50
45

ソース

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 = 5;
		character.hp -= damage;
	}

}
App.java
package rpg;

public class App {

	public static void main(String[] args) {
		Character wizard = new Character("アリス", "wizard");

		System.out.println(wizard.name);
		System.out.println(wizard.job);
		System.out.println(wizard.hp);
		System.out.println(wizard.level);
		
		wizard.walk("left");
		
		Character warrior = new Character("ボブ",  "warrior");

		wizard.talk(warrior, "勝負しましょう!");
		
		wizard.attack(warrior);
		System.out.println(warrior.hp);
	}

}

演習

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

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クラスの walk() のことを何といいますか?

  1. staticメソッド
  2. フィールド
  3. インスタンス
  4. インスタンスメソッド

問題2

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

  1. わん! ポチが歩いた にゃー!
  2. わん! ポチが歩いた にゃー!ミケが逃げた
  3. ポチが歩いた わん! にゃー!ミケが逃げた
  4. ポチが歩いた わん! ミケが逃げた