• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:変数を引数に取る??)

Javaの勉強中に気になるコードの部分について質問です

このQ&Aのポイント
  • Javaの勉強中の初心者が、「やさしいJava」P481のソースコードについて質問です。
  • 地点1-1では、DriverクラスのコンストラクタでCompanyクラスの変数cを仮引数に取り、地点2ではDriverクラスのオブジェクトdrv1を作成し、引数にCompanyクラスの変数cmpを代入しています。
  • なぜメソッドの引数に変数を取るのか、またcompとcmpの違いについて教えてほしいとのことです。

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

  • ベストアンサー
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.1

地点1-1でのcはメソッド内(ここではコンストラクタ)だけの ローカルな変数になるので、コンストラクタの処理が終わると cは保持されません。 しかし地点1-2でのcompは、Driverクラスのプロパティなので、 Driverクラス(ここでは地点2およびその次の行でnewしたもの)が 保持されている間は保持されることになります。 ここではDriverクラスにCompanyクラスを保持してもらいたいのです。 そのためのメソッド(ここではコンストラクタ)を呼んでいますが、 仮引数cは、その処理上に生じた一時的な変数です。 このソースの主題は、Driverオブジェクトをを2つ作ったが、 それらが保持しているCompanyオブジェクト(cmp)は同一なので、 drv1/drv2が各々でaddを50円で3回ずつ呼んだとしても、 drv1は150円、drv2は150円、ではなく、300円になる、 ということかと思います。

arg_args
質問者

お礼

大変遅れました。 ぼんやりながら理解できたと思います。 また質問させていただくかもしれません、 ありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • コマンドライン引数を用いて。

    コマンドライン引数を用いて足し算をさせるプログラムです。 class goukei{ public static void main(String args[]){ int i, count; int sum = 0; int a[]; count = args.length; for(i=0; i<args.length; i++){ int arg_i = Integer.parseInt(args[i]); sum = sum + arg_i; } System.out.println("引数の数は" + count); System.out.println("合計は" + sum); } } と考えたのですが、もっとこうしたほうがいいという部分があれば教えてください。 一応これでできているとは思うのですがイマイチ自信がありません・・・。

    • ベストアンサー
    • Java
  • 関数の引数と実引数の取り扱いについて

    C言語初心者です. 関数の引数と実引数の取り扱いについて,教えていただきたいことがあります. 例えば,2変数の和を求める関数を考えると,以下のようになると思います. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; } このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算させているわけですが,mainプログラムで変数x,yを定義しておいて,以下のようなプログラムにするのはありでしょうか? 参考書などをみると,前者のように取り扱っているようなのですが,試しに後者で実行させてみても同じ結果となりました. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; }

  • 初歩的な メソッドの引数について

    参考書のサンプルなんですが、 Carクラスのメソッドの引数のところで num = n と代入しているのですが、 これを直接void setNum(int num)としたほうがらくだと思うのですがなにか意味があるのでしょうか? class Sample4{ public static void main(String args[]){ Car car1 = new Car(); car1.setNum(33); } } class Car{ int num; void setNum(int n){ num = n; System.out.println("台数" + num); } }

    • ベストアンサー
    • Java
  • bsearch関数の呼び出しで

    C言語の深いところまで理解しようとしてます。今まで使わないだろうと思っていた関数へのポインタ なのですが、 2分探索のところで bsearch関数というのが出てきました。 この関数は第5引数に比較関数を引数にするのですが p = bsearch(&ky, x, nx, sizeof(int), (int (*)(const void *,const void *))int_cmp ); という形でサンプルソースには載っています。 この (int (*)(const void *,const void *))int_cmp の部分なのですが、まず戻り値をキャストするなら int (*)ではなく(int *)ではないでしょうか。 それとint_cmpは比較関数なのですが、引数が左側に来る、というところが納得できません。 ちなみにソースファイルをcppのままだとコンパイルできませんでした.cに拡張子を直したらコンパイルできました。 説明が足りないところがあったら指摘してください。お願いします。

  • String typeの引数をつかって 変数はつくれますか?

    いつもお世話になっております。 以下のように、引数を使って、変数をていぎしたいのですが。。。 public static void main(Stirng[] arg){ String hikisuu = "サンプル"; method(hikusuu); } public static void method(String hikisuu){ int hikisuu = 5; } java でこのようなことは可能でしょうか? (実際やったらエラーが出ました...) ほかの方法で、これと同じようなことを実現でくる方法はありますでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • 関数の引数なしを変数に代入したら入ってきた数値は何?

    デバッグソフトで自分のプログラムを動かしていたときに、 int test_func(char x) { x = x + 1; ------(中略)----------- return x; } int main(void) { int test_val; ------(中略)----------- test_val = test_func; ------(中略)----------- } このようにtest_func(char x)という関数の戻り値を変数test_valに代入するつもりだったのですが、間違って引数部分を書かずにコンパイルしてしまいました。 このときにコンパイルでエラーが出ると思ったのですが、コンパイル完了でデバッガで変数test_valをみてみると何か値が入っていました。 ちょっと気になったのですが、この変数の中に入った値はいったい何なのでしょうか。ご存じの方いらっしゃいましたらご教授お願いいたします。

  • 仮引数について。

    こんにちは。 現在Javaを勉強中の者です。 ある程度簡単なプログラムは組めるようになったのですが、 ふと仮引数について疑問に思ったことがあったので 質問させて下さい。 まず、自己紹介をするクラスがあるとします。 そこで、入力された名前を表示する、というメソッドを作りたいのですが (1) class Introduction {     /* メンバ変数 */    String strName;     /* 名前を言う */     public void sayName(String strName) {     System.out.println("私の名前は " + strName + " です。");   } } と書くのと (2) class Introduction {   /* メンバ変数 */   String strName;   /* 名前を言う */   public void sayName(String n) {     strName = n     ~~~~~~~~~~~~     System.out.println("私の名前は " + strName + " です。");   } } と書くのでは何がどう違うのでしょうか? 特に波線部分の役割の理解に苦しんでいます。 参考書のサンプルソースを見ると、 たいていこのような記述があるのですが わざわざ代入しなくても(1)のように記述すれば 正常に出力されますよね? 実引数から値を渡されたときは 必ず(2)のような書き方をしなければならない決まりが あるのでしょうか? 長くなりましたが、ご教授いただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 消滅したローカル変数のメモリ領域への上書きについて

    Cプログラミング初心者のものです。 課題でわからないところがあるので質問いたします。 以下ソース typedef struct comp{ int val1; int val2; }*comp_t,comp_val; comp_t first(); void second(); int main(int argc, char **argv){ comp_t ret; ret=first(val); second(); printf("Val1=%d,Val2=%d\n",ret->val1,ret->val2); } comp_t first(){ comp_val comp; comp.val1=10; comp.val2=20; return &comp; } void second(){ int a=-100; int b =-200; } 実行すると Val1=-200,Val2=-100 と出ます。ローカル変数が消滅し、second()で新たなintを二つ定義しているので、キレイに上書きされて結果が出たことはわかるのですが、 それなら普通、-100,-200の順に出るのではないのでしょうか。 なぜ裏返ってしまったのでしょう? また、それはソースを見ただけでわかるものなのでしょうか。 返信お願いします。

  • 参照型の変数をポインタ引数を持つ関数に引数を書く方法

    C++の参照を使って以下のソースを試したのですが、 memmoveの引数のところでエラーが出ます。 memmoveの引数はポインタ型で合いません。 実体コピーしたい場合、どのようにすればよいのでしょうか? const AA &aとすれば、a自体が関数内で書き換わる心配がないので、 C++の参照型は、ポインタより安全と理解しているのですが その認識は間違っていないでしょうか? struct aa{ int x; int y; }AA; void test(AA &a) { AA b; memmove(b, a, sizeof(AA)); } void main(){ AA c; test(c); }

  • qsortについて

    qsort()で構造体をソートする時に、qsortの第3,4引数時の、「size t_t size, int (*cmp)(const void *a, const void *b)」の使い方が分かりません。 何故これを使ってソートが出来るのでしょうか?そもそも、構造体を送った時に、自作関数内での書き方にも疑問があります。 int main(void){ MAX dt[5]={・・・・}; //構造体変数宣言 ・・・・・ qsort(dt,5,sizeof(MAX),sum); //(*1) .... return 0; } int sum(const void *a, const void *b){ MAX *p1 = (MAX *)a; //(*2) MAX *p2 = (MAX *)b; //(*2) ・・・・ return ~; } ---------------------------------------------------- *1: 第3引数のsizeof(MAX)って何ですか? *2: 例えばint型が渡されてreturnする場合は、「return *(int *)a - *(int *)b 」でいいのに、   何故構造体の場合はこう書かないといけないのですか?