「メソッド」というのはクラス内で定義されているフィールドを操作するための関数で、言語によっては「メンバ関数」と呼ぶ事があります。
2ページ目で説明したようにメソッドはクラス定義の中で次のように定義します。
アクセス修飾子 型 メソッド名(引数){ 内容; }
では実際に Score クラスに何かメソッドを追加してみましょう。
次のソース 1 では例として Score クラスに数学と英語の平均を求める average メソッドを追加しました。
public class Score { public int math; public int english; public double average(){ return ( math + english )/2.0; // ※ } } ※ 正式には「this.math + this.english」と書きますが Java の場合は this. は省略可能です ※ なお this. を付けないと誤作動するプログラミング言語(JavaScriptなど)もありますので注意して下さい ※ またthisではなくてselfなど他のキーワードを使う言語もあります。
さてこの様に定義したメソッドは他のインスタンスから
インスタンス名.メソッド名(引数)
と呼び出す事ができます(※)。
※ 同じクラス内で定義されているメソッドを呼び出す時は「this.メソッド名(引数)」と書きますが Java の場合は this. は省略可能です
※ なお this. を付けないと誤作動するプログラミング言語(JavaScriptなど)もありますので注意して下さい
※ またthisではなくてselfなど他のキーワードを使う言語もあります。
この様にして他のインスタンスやメインメソッドから別のインスタンスで定義されているメソッドを呼び出し、インスタンスにデータを引き渡したり何かの処理をさせることを「メッセージ・パッシング」と言います。
では早速メインメソッドからソース 1 で追加した average メソッドを呼び出して(メッセージ・パッシングして)みましょう。
public class Main{ public static void main(String[] args) { Score sc_taro = new Score(); sc_taro.math = 5; sc_taro.english = 3; Score sc_hanako = new Score(); sc_hanako.math = 80; sc_hanako.english = 70; System.out.println( "太郎: math = " + sc_taro.math+ " english = " + sc_taro.english + " 平均 = " +sc_taro.average()); System.out.println( "花子: math = " + sc_hanako.math+ " english = " + sc_hanako.english + " 平均 = " +sc_hanako.average()); } }
ソース 2 を実行すると次の結果が表示されます。
太郎: math = 5 english = 3 平均 = 4.0 花子: math = 80 english = 70 平均 = 75.0
ここで太郎と花子の平均が違うことに注目して下さい。
同じメソッドを呼び出してもインスタンス毎にフィールド値が違うのでメソッドの実行結果が変わります。
さて上の average メソッドには引数がありませんでしたが、当然メソッドには引数を持たせる事も出来ます。
例えば Score クラスに数学の点数を変更する set_math メソッドを追加してみましょう。
public class Score { public int math; public int english; public double average(){ return (math + english)/2.0; } public void set_math( int s ){ math = s; } }
set_math メソッドの引数は int 型の s で、メソッド内部で math フィールドの値を s の値に置き換えています。
ではソース 4 の様にしてインスタンスを作り、この set_math メソッドを呼び出してみましょう。
public class Main{ public static void main(String[] args) { Score sc_taro = new Score(); sc_taro.math = 5; sc_taro.english = 3; Score sc_hanako = new Score(); sc_hanako.math = 80; sc_hanako.english = 70; System.out.println( "太郎: math = " + sc_taro.math+ " english = " + sc_taro.english + " 平均 = " +sc_taro.average()); System.out.println( "花子: math = " + sc_hanako.math+ " english = " + sc_hanako.english + " 平均 = " +sc_hanako.average()); sc_taro.set_math(20); // (1) System.out.println( "太郎: math = " + sc_taro.math+ " english = " + sc_taro.english + " 平均 = " +sc_taro.average()); System.out.println( "花子: math = " + sc_hanako.math+ " english = " + sc_hanako.english + " 平均 = " +sc_hanako.average()); } }
(1) の所で太郎の数学の点数を5点から20点に変更しています。 すると実行結果は以下のとおりになります。
太郎: math = 5 english = 3 平均 = 4.0 花子: math = 80 english = 70 平均 = 75.0 太郎: math = 20 english = 3 平均 = 11.5 花子: math = 80 english = 70 平均 = 75.0
このメッセージ・パッシングは手続き型プログラミング言語には無い概念なので、理解するまで例題を改造したりして何度も復習してください。