戻り値を使ってメソッドを返す方法について


<http://www.javadrive.jp/start/method/index5.html> このサイトを参考にしています。

この中にある、

[code]

    class JSample5_1{
      public static void main(String args[]){
        int kekka;
    
        kekka = bai(9);
        System.out.println(kekka);
    
        kekka = bai(5);
        System.out.println(kekka);
      }
    
      private static int bai(int n){
        return n * 2;
      }
    }
    
[/code]

の部分なんですが、よく理解できておりません。`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` といった様な`倍数`の様な物が格納されている訳ではありません。

以下の例を見て下さい。

[code]

    int n = 3;
    kekka = bai(n); // 3 を渡す
    n = 4; // kekka には既に 6 が代入されているので n を変更しても意味はない
    
[/code]

kekka に 6 が格納された後で n の値を変えても遅いのです。

もう一つ例を示します。

[code]

    kekka = bai(2 * 3);
    
[/code]

これは以下の様に動作します。

  1. `2 * 3` が評価され 6 という値が作られる
  2. 6 という値が bai に渡される
  3. bai により、`2 * 6` つまり 12 という値が戻される
  4. kekka という変数に 12 が格納される

今後プログラミングをやっていく過程で`遅延評価`という言葉と共に、即時で評価しない仕組みが登場してくるかと思いますが、今回のケースは当てはまりません。ご注意下さい。

**おまけ**

[code]

    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));
        }
    }
    
[/code]

上のソースを実行し、main の `'+'`
の部分を他の演算子に変えて試して貰うと本来の`戻り値を使ってメソッドを返す方法`をどう実装するかが理解できると思います。  
関数オブジェクトという、関数本体を返す方法は Java8 で実現出来るのですが、おそらく勉強段階の今はやらない方がよいと思います。

