コードの意味を解説して頂けないでしょうか。

このQ&Aのポイント
  • addメソッドはNumberクラスの参照を引数にとり、自分の数との合計値をフィールドに持つ新しいオブジェクトを作成して返します。
  • Numberクラスは整数値をフィールドとして持ち、その値を返すゲッターメソッドやコピーを作成するメソッドを持っています。
  • 実行結果はa + b = 110となります。
回答を見る
  • ベストアンサー

コードの意味を解説して頂けないでしょうか。

【問題文】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)」が何を意味しているのか全く分かりません。 よろしくお願い致します。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

> 前者の「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オブジェクトを生成して返す」もの、と言う事ができます。

taro_11
質問者

お礼

詳細で丁寧な解説ありがとうございます。 やっと理解出来ました。 私の場合、「Number(n+m.n);」の部分を「Number((n+m).n);」のように勝手に解釈して、 その先入観がずっと頭から離れず堂々巡りをしておりました。

その他の回答 (2)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

> 前者の「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に代入されているのだな。

taro_11
質問者

お礼

返信ありがとうございます。 「 Number(this.n+m.n)」のように考えれば良かったのですね。 その辺に気が付かなくて頭が混乱していました。 具体的な例を挙げて頂き、とても勉強になります。

  • kotoby2003
  • ベストアンサー率15% (280/1755)
回答No.1

私にもよくわかりませんね。 「return new Number(n+m.n);」に対応するNumber(Number a, Number b)のコンストラクタがNumberクラスに見受けられないので、上記のコードだけでは、コンパイルエラーになるのではないかと思います。

taro_11
質問者

お礼

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

関連するQ&A

  • Javaの戻り値のコード

    Java初心者です。returnの例文で分からない所があります。 (1)考え方として car1.setNumGas(1234, 20.5); の時点で void setNumGas(int n, double g) はvoid setNumGas(1234, 20.5)になり 次にgetNum( ) そのものを引っ張ってきているので、 ナンバーを調べました という文字まで一緒に引っ張らないのでしょうか? なぜ 次の行のretun文だけを拾うのですか? (2)returnのイメージがまだ出来ていません。 int number = car1.getNum(); とした時点で int getNum()  にジャンプし、 その中の returnを見つけ、 そしてreturnが numを使っている所をコードを下に降りて順に探しに行く というイメージで合ってますか? -------------------------------------------------------------------- return num; →よーし探しに行こう! まずdouble getGas()の中 → うーんない 次にvoid setNumGas(int n, double g) の中 { num = n;    →   お、あった! nは今1234だな、だから表示結果は1234 --------------------------------------------------------------------------- こんな認識で合ってますでしょうか? class Car { int num; double gas; int getNum() { System.out.println("ナンバーを調べました。"); return num; } double getGas() { System.out.println("ガソリン量を調べました。"); return gas; } void setNumGas(int n, double g) { num = n; gas = g; System.out.println("車のナンバーを" + num + "にガソリン量を" + gas + "にしました。"); } void show() { System.out.println("車のナンバーは" + num + "です。"); System.out.println("ガソリン量は" + gas + "です。"); } } class Sample6 { public static void main(String[] args) { Car car1 = new Car(); car1.setNumGas(1234, 20.5); int number = car1.getNum(); double gasoline = car1.getGas(); System.out.println("サンプルから車を調べたところ"); System.out.println("ナンバーは"+ number + "ガソリン量は" + gasoline + "でした。"); } }

    • ベストアンサー
    • Java
  • synchronizedが解りません。

    synchronized( a ) { a.add(); } ブロック文で aオブジェクトをロックしてるはずなんですが 結果を見ると出来てないようです なぜうまくいかないんでしょうか? 教えてください。 class Test extends Thread { feet a = new feet(); public static void main( String args[] ){ for( int i = 0; i < 3; i++ ){ Test b = new Test(); b.start(); } } public void run() { synchronized( a ) { a.add(); } } } class feet{ int n, m; void add(){ n++; System.out.println( n + " " + m ); try { Thread.sleep( 1000 ); }catch( InterruptedException err ){ } m++; System.out.println( n + " " + m ); } }

    • ベストアンサー
    • Java
  • コードの解説をお願い致します。

    「わかりやすいjavaオブジェクト指向編 P212 練習9-1 3」より 【問題文】 次のクラスがある。ToolクラスのサブクラスとしてmyToolクラスの 中にclearメソッドをオーバーロードしなさい。 package ex_9_1_4; class Tool{ public void clear(int[] n){ for(int i=0; i<n.length; i++){ n[i] = 0; } } } class myTool extends Tool{ } public class Exec { public static void main(String[] args) { int[]n   = { 3,5,9 }; int[][]m  = { { 3,2 }, { 9,4,2 } }; myTool t  = new myTool(); t.clear(n); t.clear(m);  } } 【正解】 public void clear(int[][] n){ for(int i=0; i<n.length; i++){ clear(n[i]); //1次元配列のクリア } } 【解説】 1次元配列のクリアには継承した親クラスのメソッドを利用する。 または、2重forループを書いてその中で配列をクリアしても構わない。 クラスToolのメソッドは理解出来ています。 クラスMyToolのメッソドの意味がさっぱり分かりません。 (1)正解のメソッドの解説をして頂けないでしょうか。 (2)2重forループの方法でも構いません。 (3)ゼロでクリアした配列要素を全て表示するコードを  追加したいのですが、どのように書けばいいのでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • 空白文字について

    C言語の初心者です。 今、VC 6.0の環境で電卓を作っています。 エディットボックスに数値を入力して計算させるプログラムなのですが エディットボックスにスペースを入力されても計算出来るようにしたいのですが解りません。 NULL文字をチェックすればよいのか、それとも「isspece」の関数を使って空白文字を調べればよいか解りません。プラス「+」、マイナス「-」の符合が入力されても計算出来るようには行えたのですが、どうしても空白(スペース)を入力された場合が、うまくいきません。 作成途中のソースコードです。ご指導お願いします。 // OnButton1() ///////////////////////////////////////////////////////////////////// void CKasanDlg::OnButton1() { adding(); char num1[128],num3[128]; int i,length=strlen(&num1[0]); int numk,numl=0; m_num3.GetLine( 0, num3 ); numk = sscanf( num3, "%d", &numl ); for( i=0; i<length; i++ ){ isdigit( (int) num1[i] ); } if(( numk == -1 )){ MessageBox("数値を入力してください。"); // メッセージボックス } } // 足算 (num) ///////////////////////////////////////////////////////////////// void CKasanDlg::adding() { char num1[128],num2[128]; int number1=0, number2=0,sum=0; CString ans; int nums,numa; int i=0, m=0, add1=0,add2=0; m_num3.SetSel( 0,-1 ); m_num3.Clear(); m_num1.GetLine( 0, num1 ); int length1 ; if(( num1[ 0 ] == '-' ) || ( num1[ 0 ] == '+' )){ length1 = strlen ( &num1[1] ); for( i=0; i<length1; i++ ){ add1 = isdigit( (int)num1[i+1] ); if( add1 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・左側)"); break; } } } else{ length1 = strlen ( &num1[0] ); for( i=0; i<length1; i++ ){ add1 = isdigit( (int)num1[i] ); if( add1 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・左側)"); break; } } } m_num2.GetLine( 0, num2 ); int length2; if(( num2[ 0 ] == '-' ) || ( num2[ 0 ] == '+' ) || ( num2[ 0 ] == ' ' )){ length2 = strlen ( &num2[1] ); for( m=0; m<length2; m++ ){ add2 = isdigit( (int)num2[m+1] ); if( add2 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・右側)"); break; } } } else{ length2 = strlen (&num2[0]); for( m=0; m<length2; m++ ){ add2= isdigit((int)num2[m]); if( add2 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・右側)"); break; } } } if((add1 == 0 ) && ( add2 == 0)){ return ; } if((add1 == 0 ) && ( add2 != 0)){ return ; } if((add1 != 0 ) && ( add2 == 0)){ return ; } nums = sscanf( num1, "%d", &number1 ); numa = sscanf( num2, "%d", &number2 ); if(( nums == 1) && ( numa == 1)){ sum = number1 + number2; ans.Format( "%d",sum ); m_num3.SetSel( 0, -1 ); m_num3.Clear(); m_num3.ReplaceSel( ans ); } } ///////////////////////////////////////////////////////////////////////////////

  • C#のソースコードについての質問です

    using System; public class kkk { public static void Main() { ddd d = new ddd(); int i = d.knapsack(0, 0); Console.WriteLine("" + i); } } public class ddd { int[] ws = new int[] { 3, 4, 1, 2, 3, }; int[] ps = new int[] { 2, 3, 2, 3, 6 }; int maxw = 10; public int knapsack(int n, int w) { if (w > maxw) return -1; if (n >= ws.Length) return 0; return Math.Max(knapsack(n + 1, w), knapsack(n + 1, w + ws[n]) + ps[n]); } } このコードを書いたらエラー 1 静的でないフィールド、メソッド、またはプロパティ 'kkk.d' で、オブジェクト参照が必要です というエラーがでてきました、構文が間違っているところが分かりません どなたか教えてください

  • 加算、減算、乗算、除算について

    // 加算、減算、乗算、除算について // 記号と数値にそれぞれ別の配列に分けました。 // そこから、どうすれば計算ができるのか // 悩んでいます。よろしくお願いします。 #include<iostream> using namespace std; char **tokei(char *str1,char *str2,int *count,char *kigouX); int main() { int count; int *num; char **www; char kigo[12]; char str1[30],str2[]="+-*/"; strcpy(str1,"123+45-6*789/"); www=tokei(str1,str2,&count,kigo); num=new int[count]; for(int n=0;n<count;n++) { num[n]=atoi(www[n]); } // 数値に変換num[]、記号を順番に抽出kigo[] -->OK // 記号に沿って、数値を演算すればよい。 // ここがやり方(理屈)がわからない。 getchar();{}return 0; } char **tokei(char *str1,char *str2,int *count,char *kigouX) { int cnt=0; int m=0; for(int a=0;*(str1+a)!='\0';a++){} for(int b=0;*(str2+b)!='\0';b++){} for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { if(*(str1+i)==*(str2+j)) { *(kigouX+m)=*(str1+i);m++; *(str1+i)='\0'; cnt++; } } } *(kigouX+m)='\0'; char **c; c=new char*[cnt]; *count=cnt; for(int m=0;m<cnt;m++) { c[m]=str1; while(*str1!='\0'){str1++;}str1++; } return c; }

  • コードのどこが間違っているのかを教えてください。

    ある文字を入力し、それをカンマ区切りして3つに分け、その3つの最大値を表示するプログラムを入力したいです。ただし、条件として、上限の桁数5を越える、文字か数字化の判定を行い、文字が1つでも混ざっている際はエラー表記され再度入力、さらに終了判断を行う際も、あくまで「y」「n」と入力したときのみが正常であり、複数文字を入力する際は、エラー表記され、再度入力という形をとりたいです。 フローを書きながら、サブ関数も使い、LINUXで以下のように書いてみました。 ただ、これだと /*-----------------------------------------*/ /tmp/ccKMOmJN.o: In function `word_judge': kadai6.c:(.text+0x4b2): undefined reference to `isdigits' collect2: ld はステータス 1 で終了しました /*-----------------------------------------*/ となってしまいました。 どのようなコードに直せばいいのでしょうか? すごく長いですが、わかりやすく解説してくださると、とても助かります。 あと、fgets関数やsscanf、getchar関数など、ネット上のサンプルを参照して、使っただけなので、もしかしたら間違ってるかもしれません。 そこについても、教えてくださると、とてもうれしいです。 /* ソースコード */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #define LIMIT (5) #define NULLB '\0' #define ECOUNT (20) #define EWORD (2) int word_judge(char array[]); void digits_judge(int a_len , int b_len , int c_len) ; int main(int argc , char *argv[]) { int number_a ; int number_b ; int number_c ; int input_len ; int a_len ; int b_len ; int c_len ; int end_len ; char input[ECOUNT] ; char a[ECOUNT] ; char b[ECOUNT] ; char c[ECOUNT] ; char array[ECOUNT] ; char end[EWORD] ; end[0] = 'n' ; while( end[0] == 'n' ) { while(1) { number_a = 0 ; number_b = 0 ; number_c = 0 ; input_len = 0 ; a_len = 0 ; b_len = 0 ; c_len = 0 ; end_len = 0 ; memset(input , NULLB , sizeof(char) *ECOUNT) ; memset(a , NULLB , sizeof(char) *ECOUNT) ; memset(b , NULLB , sizeof(char) *ECOUNT) ; memset(c , NULLB , sizeof(char) *ECOUNT) ; memset(end , NULLB , sizeof(char) *EWORD) ; printf("a , b , c ?:") ; fgets(input , ECOUNT , stdin); input_len = strlen(input); if( input_len < ECOUNT-1 ) { sscanf(input , "%[^,] , %[^,], %s" , a , b , c); if(a[0] != NULLB && a[0] != NULLB && c[0] != NULLB) { if(word_judge(a) != 0 && word_judge(b) != 0 && word_judge(c) != 0 ) { a_len = strlen(a) ; b_len = strlen(b) ; c_len = strlen(c) ; if(a_len >= LIMIT || b_len >= LIMIT || c_len >= LIMIT) { digits_judge(a_len , b_len , c_len) ; } else { number_a = strtol(a , NULL , 10) ; number_b = strtol(b , NULL , 10) ; number_c = strtol(c , NULL , 10) ; printf("最大値:") ; if(number_a > number_b && number_a > number_c) { printf("%d\n", a); } else { if(number_b >number_a && number_b > number_c) { printf("%d\n", b) ; } else { printf("%d\n", c) ; } } break ; } } else { printf("文字が混ざっています。\n") ; } } else { printf("正しく入力して下さい。\n") ; } } else { if(input[ECOUNT] == '\n') { } else { while(getchar() != '\n'); } printf("入力数が多いです。\n"); } } while(1) { int end_len ; char end[EWORD] ; end_len = 0 ; memset(end , NULLB , sizeof(char) *EWORD) ; printf("終了しますか? y/n: "); fgets(end , EWORD , stdin); end_len = strlen(end); printf("\n"); if(end_len == EWORD) { if(end[0] != 'y' && end[0] != 'n') { printf("y or nを入力して下さい。\n"); } else { break ; } } else { if(input[ECOUNT] == '\n') { } else { while(getchar() != '\n'); } printf("入力が間違っています。y or n を入力しなおしてください。\n"); } } } return 0 ; } int word_judge(char array[ ]) { int array_len ; int i ; int tmp ; int r_value ; tmp = 0; r_value = 0 ; for(i=0 ; i< array_len ; i++) { tmp = isdigits(array[i]) ; if(tmp != 0) { r_value = 1; } else { r_value = 0; break ; } } return r_value ; } void digits_judge(int a_len , int b_len , int c_len) { int a ; int b ; int c ; a = 0 ; b = 0 ; c = 0 ; a_len = 0 ; b_len = 0 ; c_len = 0 ; if(a_len >= LIMIT) { a = 1 ; } else { } if(b_len >= LIMIT) { b = 10 ; } else { } if(c_len >= LIMIT) { c = 100 ; } else { } switch(a + b + c) { case 111 : printf("aとbとcの桁が多いです。\n"); break; case 11 : printf("aとbの桁が多いです。\n"); break; case 110 : printf("bとcの桁が多いです。\n"); break; case 101 : printf("cとaの桁が多いです。\n"); break; case 1 : printf("aの桁が多いです。\n"); break; case 10 : printf("bの桁が多いです。\n"); break; case 100 : printf("cの桁が多いです。\n"); break; } }

  • c言語の関数について

    .#include<stdio.h> int input_number(void); int main(void) { int num; int total = 0; while(){ num = input_number(); if(num == 0){ break; } total = total + input_number(); } printf("¥n合計値は%dです¥n", total); return 0; } int input_number(void) { int num; printf("数値を入力してください: "); scanf("%d", &num); return num; } 個人でcを勉強しております。 このプログラムで間違っているところを教えていただけませんでしょうか? 苦戦して困っております。できれば勉強法も教えてていただきたいです。 どうか宜しくお願いします。

  • オブジェクトを定義してからの計算が出来ない

    質問内容はタイトルどおりです。 まず、以下のようなソースを書きました。 class math{ public int ma; public int mb; math(){ ma=0; mb=0; } math(int n){ ma=n; mb=0; } math(int n,int m){ ma=n; mb=m; } int add(int num){ math omath=new math(); omath.ma=this.ma+num; omath.mb=this.mb*num; omath=omath.ma+omath.mb; return omath; } } これで実際にコンパイルすると下のようなエラーが出てしまいました。 math.java:25: 互換性のない型 検出値 : int 期待値 : math omath=omath.ma+omath.mb; ^ math.java:27: 互換性のない型 検出値 : math 期待値 : int return omath; ^ エラー 2 個 参考書等も何冊か読んでみたのですがいい解決法が見つかりません。 詳しい方がいましたら教えていただけるとありがたいです。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • javaプログラム 合ってるかお願いします

    プログラムは非常に苦手なため合ってないと思いますが、合ってないのは何が正解かを教えてください。 よろしくお願いします 1 ローカル変数を全て答えよ args,num 2 インスタンス変数を全て答えよ num 3 インスタンスメソッド名を答えよ Example2 4インスタンスメソッドを呼び出している行 public class Example2{ int num; public static viod main(String[] args){ Example2 ex2 = new Example2(5); int a = ex2.getNum(); System.out.println(a); } Example2(int num){ this.num=num; } int getNum(){ return this.num; } }

    • ベストアンサー
    • Java

専門家に質問してみよう