アプリ版:「スタンプのみでお礼する」機能のリリースについて

【問題文】addメソッドはNumberクラスの参照を引数にとり、
自分の数との合計値をフィールドに持つ新しいオブジェクトを作成して返します。
(わかりやすいjavaオブジェクト指向入門編 P135より)

package ex6_2;
public class Number {
private int n;
public Number(int n){this.n = n;}

public int getN(){return n;}
public Number copy(){
Number num = new Number(n);
return num;
}
public Number add(Number m){
return new Number(n+m.n);
}
}


package ex6_2;
public class Exec {
public static void main(String[] args) {
Number a = new Number(10);
Number b = new Number(100);
Number c = a.add(b);
System.out.println("a + b =" + c.getN());
}
}

実行結果
a + b = 110

「return new Number(n+m.n);」と「Number c = a.add(b);」が問題の空欄部分です。
前者の「Number(n+m.n)」が何を意味しているのか全く分かりません。
よろしくお願い致します。

A 回答 (3件)

> 前者の「Number(n+m.n)」が何を意味しているのか全く分かりません。



やっている事を一つ一つ見ていけば理解できるかと思います。

----------------------------------------
public Number add(Number m){
return new Number(n+m.n);
}
----------------------------------------

これを分解していくと下記の様に書き直せます。

----------------------------------------
public Number add(Number m) {

int argN = m.n; // (1) 引数のNumberオブジェクトのnを取り出す。

int num = n + argN; // (2) 自分自身のnと(1)で取り出した引数のNumberオブジェクトのnを足して、変数numに入れる。

Number number = new Number(num); // (3) 足した結果を元に新しいNumberオブジェクトを作る。

return number; // (4) 作った新しいNumberオブジェクトをメソッドの戻り値として返す。
}
----------------------------------------

したがって、addメソッドは「自分自身と引数のNumberオブジェクトのnの値を足し合わせたものをnに持つ新たなNumberオブジェクトを生成して返す」もの、と言う事ができます。
    • good
    • 0
この回答へのお礼

詳細で丁寧な解説ありがとうございます。
やっと理解出来ました。

私の場合、「Number(n+m.n);」の部分を「Number((n+m).n);」のように勝手に解釈して、
その先入観がずっと頭から離れず堂々巡りをしておりました。

お礼日時:2013/07/30 06:39

> 前者の「Number(n+m.n)」が何を意味しているのか全く分かりません。


new Number(n+m.n)は、new Number(this.n+m.n)と書き換える事ができる。
public Number add(Number m) {
return new Number(this.n+m.n);
}
つまり、自分自身のnと引数で指定されたNumberクラスの別インスタンスのnを足し合わせたintを引数にさらに別のNumberクラスのインスタンスを作ってそいつをリターンしている訳だ。
なので、
Number a = new Number(10);
Number b = new Number(100);
Number c = a.add(b);
は、nが10であるaと、nが100であるbの2つのNumberクラスのインスタンスが作られた後、a.add(b)というところでnew Number(a.n+b.n)すなわちnew Number(10+100)でnが100であるNumberクラスのインスタンスが作られてcに代入されているのだな。
    • good
    • 0
この回答へのお礼

返信ありがとうございます。

「 Number(this.n+m.n)」のように考えれば良かったのですね。
その辺に気が付かなくて頭が混乱していました。

具体的な例を挙げて頂き、とても勉強になります。

お礼日時:2013/07/30 06:42

私にもよくわかりませんね。


「return new Number(n+m.n);」に対応するNumber(Number a, Number b)のコンストラクタがNumberクラスに見受けられないので、上記のコードだけでは、コンパイルエラーになるのではないかと思います。
    • good
    • 0
この回答へのお礼

返信ありがとうございます。

お礼日時:2013/07/30 06:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!