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)ポチが歩いた わん! ミケが逃げた