質問: bai(5); System.out.println(kekka); } private static int bai(int n){ return n * 2; } } ``` の部分なんですが、よく理解できておりません。`return n*2` が `bai(int n)` の `n` の部分に`x2` が入るので、`(bai=x2)` ということで合ってますか? そして `kekka=bai(9)` に `x2` が入って `18`, `kekka=bai(5)` に `x2` が入って `10` ということですか? あと、最初のほうに `void`(戻り値を無効にするという意味ですか?)と書いてありますが `return` を書くと、`return` が適用され、最初の `void` は打ち消されるということですか?
回答: 一般的なプログラミング言語では、特に細工を入れない限りは演算(`+` とか `-` とか `*` とか `/` 等)は即時で評価されます。`bai(9)` を実行すると n には 9 という`値`が格納されるので `n * 2` は`即時で評価`され 18 という数値の結果が出ます。その値は return で呼び出し元(main)に戻され kekka という変数に代入されます。掛け算という物が代入されるのではなく、結果である 18 である事に注意して下さい。 n には `x2` といった様な`倍数`の様な物が格納されている訳ではありません。 以下の例を見て下さい。 ``` int n = 3; kekka = bai(n); // 3 を渡す n = 4; // kekka には既に 6 が代入されているので n を変更しても意味はない ``` kekka に 6 が格納された後で n の値を変えても遅いのです。 もう一つ例を示します。 ``` kekka = bai(2 * 3); ``` これは以下の様に動作します。 1. `2 * 3` が評価され 6 という値が作られる 2. 6 という値が bai に渡される 3. bai により、`2 * 6` つまり 12 という値が戻される 4. kekka という変数に 12 が格納される 今後プログラミングをやっていく過程で`遅延評価`という言葉と共に、即時で評価しない仕組みが登場してくるかと思いますが、今回のケースは当てはまりません。ご注意下さい。 **おまけ** ``` interface Calclator { int calc(int lhs, int rhs); } class OpPlus implements Calclator { public int calc(int lhs, int rhs) { return lhs + rhs; } } class OpMinus implements Calclator { public int calc(int lhs, int rhs) { return lhs - rhs; } } class OpMult implements Calclator { public int calc(int lhs, int rhs) { return lhs * rhs; } } class OpDiv implements Calclator { public int calc(int lhs, int rhs) { return lhs / rhs; } } public class JSample5_1 { private static Calclator getCalculator(char op) throws RuntimeException { switch (op) { case '+': return new OpPlus(); case '-': return new OpMinus(); case '*': return new OpMult(); case '/': return new OpDiv(); default: throw new RuntimeException("Invalid operator"); } } public static void main(String[] args) { // 足し算クラスを戻り値として貰う Calclator c = getCalculator('+'); // c には足し算クラスが入っているので calc を実行すると 1 + 2 が // 実行され、結果 3 が返る。 System.out.println(c.calc(1, 2)); } } ``` 上のソースを実行し、main の `'+'` の部分を他の演算子に変えて試して貰うと本来の`戻り値を使ってメソッドを返す方法`をどう実装するかが理解できると思います。 関数オブジェクトという、関数本体を返す方法は Java8 で実現出来るのですが、おそらく勉強段階の今はやらない方がよいと思います。