質問: Java SE7 Silver の資格を目指し勉強中です。 分からない点は ・ 6,7行目のメソッドの受け取りについてです 1 public class Main{ 2 private int num; 3 public static void main(String[] args){ 4 new Main().sample; 5 } 6 private void sample(){ 7 increment(++num); 8 System.out.println(num); 9 } 10 private int increment(int num){ 11 num += 1; 12 return num; 13 } 14 } 回答は「1が表示される」です。解説では「incrementメソッドではreturn文でこのnumの値を返しているが、呼び出し元では返された値を受け取っていない」とあります。 確かにsampleメソッドにはvoidがついているが、呼び出し元は7行目のincrementであり、これにはvoidがついていないので、戻り値を受け取るのでは?と思いました。 返信は遅くなりますが、よろしくお願いします。
回答: これ、実はメソッドの引数や戻り値の問題ではなく、変数のスコープの問題ですね。 メソッドの戻り値を受け取るには下記のようにsampleメソッドを書き換える必要があります。 きちんとメソッドの戻り値を代入してあげる必要があります。 ``` private void sample(){ // increment(++num) // メソッドの戻り値を受け取っていないのでnum=1になる。 // incrementメソッドの引数に渡すときにインクリメントして、 // incrementメソッド内でさらにインクリメントされた値を受け取るためnum=2になる。 num = increment(++num); System.out.println(num); } ``` また、おそらく混乱されている理由はこちらではないかと思うのですが、 **incrementメソッド内のローカル変数num**と、**Mainクラスのフィールドの`private int num;`** は、**名前は同じですが、全く別の変数**です。 incrementメソッド内でMainクラス内のnumにアクセスするには下記のように、this.を付けてあげる必要があります。(変数の名前が同じため、どちらのnumにアクセスするかを明示する必要があります。) 変数名が同じため、混乱しやすいですが。 ``` private int increment(int num){ //num += 1; // incrementメソッドのローカル変数num this.num += 1; // Mainクラスのフィールド変数num return num; } ```