• ベストアンサー

二つの変数の値を入れ替えるメソッドを作成できますか?

メソッドに二つの同じ型の変数を渡し、その値を入れ替えるメソッドを作りたいのですが、Java では、関数の参照渡しができないためにできません。 できるだけシンプルな記述にしたいのですが、何か方法のわかる方、降りましたら書き込みお願いします。 ちなみにクラスをひとつ作ればできることはわかっています。 <例> public class MainProc { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ObjectPair objPair = new ObjectPair(); objPair.setObjValue1(new Integer(1)); objPair.setObjValue2(new Integer(2)); objPair.ReplaceValue(); System.out.println("intValue1:"+objPair.getObjValue1()); System.out.println("intValue2:"+objPair.getObjValue2()); } } public class ObjectPair { private Object objValue1 = null; private Object objValue2 = null; public void ReplaceValue(){ Object objWork = objValue1; objValue1 = objValue2; objValue2 = objWork; } public Object getObjValue1() { return objValue1; } public void setObjValue1(Object objValue1) { this.objValue1 = objValue1; } public Object getObjValue2() { return objValue2; } public void setObjValue2(Object objValue2) { this.objValue2 = objValue2; } } よろしくお願いします。

  • Java
  • 回答数6
  • ありがとう数5

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

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.6

もはや当初の質問からは外れてしまっているような気もしますが。 >このような意味で、名前とそれが表す意味は、 >できるだけ厳密に対応させることがほ保守性を >高める上で大切かなと私は思っているのです。 オブジェクト指向的には正しいと思います。実際JavaのExceptionクラスの大半は,そういう目的のために作られているように思われます。 #「保守性」は,try~catchのやりやすさも含むとして。 >話は戻るのですが、戻り値をひとつにまとめることが >関数型言語の考え方とありましたが、その言語は、 >何と言う言語なのでしょうか? すいません。この表現は正確ではありませんでした。関数型言語では,「引数の値を書き換えることで複数の戻り値を実現する」ことが無いだけで,値としての戻り値は複数あっても定義上は問題ないと思います。 ちなみに私はプログラミング言語については門外漢で,関数型言語はLispしか使ったことがありません。Lispでは,関数の戻り値は基本的にはプリミティヴ型の値一つか,listが一つか,どちらかなので,「戻り値が一つ」という条件は満たしてはいると思いますが…。 関数型言語について詳しく知りたければ,今だとHaskellについて調べてみるのが良いのではないでしょうか? http://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E >例えば、デザインパターンで振る舞いクラスと言うのが出てきて、 >「ん?」と思ったのです。学会とかでは、振る舞いと言う概念は、 >当時、よく研究されていた概念なのかもしれないんですが、 >それって結局、プロシージャじゃないのという印象を受けたのです。 「振る舞い」もクラス化しようと思えばできるところが,オブジェクト指向のいいところではないでしょうか? 例えばJavaにはreflectionという機能があって,そのためのものとしてjava.lang.Methodというクラスがありますが,これを使うと,例えばあるクラスにメソッドを追加するというようなことを,動的に(=プログラム実行中に)行うことも可能になります。 http://www.wakhok.ac.jp/biblion/1997/javadoc/beansdoc/node19.html Javaの初期の頃にあったHORBなどのエージェント・プログラミング環境は,このreflectionを応用していたのではなかったかと記憶しています。またEclipseなどでも,例えばメソッド名を入力すると取りうる引数の型を教えてくれる機能の辺りは,やはりreflectionを使っているのではないかと思います。 #完全に余談ですが。

den2007
質問者

お礼

とても勉強になりました。ありがとうございました。

その他の回答 (5)

  • aton
  • ベストアンサー率47% (160/334)
回答No.5

No.4です。 >この場合も Java では、「戻り値は、ひとつのクラスにまとめて >ください」と言われている気がします。 基本理念はその通りだと思います。実際,関数型言語では厳密にその通りです。でもJavaであれば,引数の中身は書き換え可能なので,例えば,ある整数列を奇数と偶数に分けるようなメソッド(これは2つの戻り値を必要とします)を書く時, static void oddEven(List<Integer> in, List<Integer>, oddOut, List<Integer> evenOut) { oddOut = new LinkedList<Integer>(); evenOut = new LinkedList<Integer>(); //本当はiteratorで書くのが良いんだけど面倒なのでforループで Integer iv = null; for(int i = 0; i < in.size(); i++) { iv = in.get(i); if ((iv.intValue() % 2) == 0) { evenOut.add(iv); } else { oddOut.add(iv); } } } static void main(String[] args) { List<Integer> input = Arrays.asList(new Integer(2),new Integer(8),new Integer(9),new Integer(3),new Integer(1),new Integer(6),new Integer(0)); List<Integer> oddOutput; List<Integer> evenOutput; oddEven(input, oddOutput, evenOutput); } などとすれば,2つの戻り値を得ることも可能です。C++などでも,複数の戻り値を得るときは,基本的にこの方法をとるはずです。 >でも、Java は、「何でもかんでもクラスにしてしまいましょう」 >という気がして、「それってどうなの。。。」という疑問もあり >ます。 Javaはオブジェクト指向言語ですから,「何でもかんでもクラスにしてしまう」のは当然かと…。RubyなんかJavaよりもっと徹底しています。クラスにするのは,再利用性を高めるためですが,クラスにしたからといって再利用しなければいけないわけではないので,「何でもかんでもクラスにしてしまう」ことが悪,というのはよくわからないのですが。 >Visual Basic .Net を見てみると、アプリケーションを構築する >ために必要なクラスは、はじめから準備されているなという印象 >を受けます。 Javaもかなり揃っていると思いますが…。例えば,ObjectPairクラス相当の処理は,既存のjava.util.LinkedListクラスを使って以下のように書くこともできます。 static LinkedList swap(LinkedList in) { if (in.size() != 2) throw new Exception(); LinkedList res = new LinkedList(); res.add(in.getLast()); res.add(in.getFirst()); } static void main(String[] args) { LinkedList objPair = new LinkedList(); objPair.add(new Integer(1)); objPair.add(new Integer(2)); LinkedList outObjPair = swap(objPair); System.out.println("intValue1:"+outObjPair.getFirst()); System.out.println("intValue2:"+outObjPair.getLast()); } mainメソッドの複雑度は殆ど変わっていないと思います。 >なのでプログラマや設計者が独自にクラスの集合を作って >しまうのは、可読性というか保守性の観点では、あまり良 >くないのではと思うのです。 車輪の再発明は良くないことなので,それはおっしゃる通りだと思います。ですからJavaにも多くのクラスを含む標準ライブラリー(java.*,javax.*)があるのだと思います。

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/LinkedList.html
den2007
質問者

お礼

そうですね。既にあるクラスをわざわざ別の名前で作ることはないと思います。 今回の場合、ObjectPair というのは、厳密には、List とは異なります。 ObjectPair では、要素を二つしか持たないからです。 このような意味で、名前とそれが表す意味は、できるだけ厳密に対応させることがほ保守性を高める上で大切かなと私は思っているのです。 戻り値の集合のクラスなら SetOfReturnValues とかいうクラスの名前がいいんじゃないかなとか、個人的には思ったりします。 それも個人的な思い込みの域は出ないかもしれないですね。 話は戻るのですが、戻り値をひとつにまとめることが関数型言語の考え方とありましたが、その言語は、何と言う言語なのでしょうか? 関数型言語と言うと私の場合、ML しか分からないのです。 これも勉強不足ですが。。。。 ML には、戻り値としてユーザー定義型のようなものは返せない気がするのですが、そんなことはないのでしょうか。 「何でもかんでもクラスにするのは。。。」というのは、オブジェクト指向の本を読んでいたりして「そんなのクラスにするなよ。」という印象を受けることがあったからです。 例えば、デザインパターンで振る舞いクラスと言うのが出てきて、「ん?」と思ったのです。学会とかでは、振る舞いと言う概念は、当時、よく研究されていた概念なのかもしれないんですが、それって結局、プロシージャじゃないのという印象を受けたのです。 プログラムの基本単位がクラスなのだからなんでもかんでもクラスにするのは、自然なことなのかもしれないですね。

  • aton
  • ベストアンサー率47% (160/334)
回答No.4

●所謂swap(a,b)をJavaで実現する方法について 複雑な方法でもよければ,introspectionを使ってオブジェクトの中身を全て入れ替えれば(たぶん)できるのではないかと思いますが…。シンプルな方法では無理だと思います。当初はjava.lang.reference.*を使えばできるかと思ったのですが,結局これでは意味がなさそうです。他には,例えば static Object[] swap(Object a, Object b) { Object[] res = new Object[2]; res[0] = b; res[1] = a; return res; } static void main(String[] args) { Object a = args[0]; Object b = args[1]; Object[] res = swap(a,b); a = res[0]; b = res[1]; } みたいな方法もありますが,これではご要望にお応えしてないでしょうし。 ●Javaに引数の参照渡しがない理由 計算機言語論的な観点からは,おそらくこのあたり↓ http://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0 に書かれているように,関数(≒メソッド)が副作用を持たないようにという考えに基づくものではないかと思います。C++の複雑さへの反省というよりは,関数型言語のより進んだ考え方を取り入れたものではないでしょうか? オブジェクト指向的にも,隠蔽の理念からは,副作用が無いほうが正しいように思われる(∵例えば副作用があるとメソッド内の処理が失敗した時,内部の手続きがどうなっているかを知らないと対処が難しい)ので,そういう理由かもしれません。 また,このページ↓ http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/620 に参照渡しがしたい時として, (1)オブジェクトのサイズが大きい時 (2)複数の戻り値をメソッドから受け取りたい時 (3)複数の変数に対する操作を抽象化したい時(例:swap(a,b)) などが挙げられているのですが,(1)はRuby同様Javaでも問題ありませんし,(2)もRubyのようなことはJavaではできませんが,所謂Out引数を与えることで問題なく解決できます。 そうすると残るは(3)なのですが,私なりにいろいろ考えてもswap以外にこういうことをしたい例を思いつけないのです。それに,上記ページでは(3)へのRubyでの解決策として, a, b = swap(a, b) が取り上げられているのですが,これって私が最初に書いたコードとあまり差が無いように見えるのです。もちろんこれは参照渡しでもなんでもなく,どちらかというとメソッドの戻り値が配列の場合それを順次受け取れるよう記述できるという syntax sugar 的なもののように思われるのですが,単にswapを簡単に実現するだけならこれでも十分そうです。 長々と書きましたが,何が言いたかったかというと,参照渡しの実際の使い途はswapぐらいしかなさそうで,だとするとswapのためだけに参照渡しのような機構を入れるのはコスト面で割に合わないのではないかということです。 もちろん,swap以外にも参照渡しでしかできない重要な処理があれば,別なのですが。

参考URL:
http://ja.wikipedia.org/wiki/%E5%BC%95%E6%95%B0, http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/620
den2007
質問者

お礼

とても勉強になりました。ありがとうございました。 私としては、これ以上、簡単な記述がないのなら、自分ではじめに記述した ObjectPair クラスのようなもの、又は、CommonLibs クラスという名前でもいいかもしれないのですが、こんなクラスが分かりやすいのかなという気がしています。 自画自賛ですが。。。。 > (2)複数の戻り値をメソッドから受け取りたい時 この場合も Java では、「戻り値は、ひとつのクラスにまとめてください」と言われている気がします。 その方が分かりやすくなるのかもしれないですね。 でも、Java は、「何でもかんでもクラスにしてしまいましょう」という気がして、「それってどうなの。。。」という疑問もあります。 Visual Basic .Net を見てみると、アプリケーションを構築するために必要なクラスは、はじめから準備されているなという印象を受けます。 私は、アプリケーションの分野によって、必要なクラスというのは、限られてくるのかなと言う気がしています。 なのでプログラマや設計者が独自にクラスの集合を作ってしまうのは、可読性というか保守性の観点では、あまり良くないのではと思うのです。

  • den256
  • ベストアンサー率70% (7/10)
回答No.3

回答いただきありがとうございます。 不変オブジェクトというのは、始めて聞きます。勉強不足ですみません。 不変オブジェクトというのは、「値を変更するメソッドのないクラスから生成されたオブジェクト」という理解でいいのでしょうか? 「値を変更したければ、オブジェクトごと入れ替えろ!」というクラスなのかな。 それは置いといて、 私は、「参照渡しができたほうが便利な関数が作れるんじゃないか」、と思っていたのですが、その機能がないのは、Java のそれ以前の言語に対するアンチテーゼ「参照渡しなんてなくてもいいじゃん」なのでしょうね。 参照渡しがなくなったのは、どういう配慮からなのでしょうか? 「Java は、C++ の簡略化版である」と聞いたことがあります。 それと 「C++ は、言語の実行が複雑で遅いので組み込みシステムには使えない」とも聞いたことがあります。 参照渡しがないのもアンチC++の理由によるのでしょうか?

回答No.2

function void Replace(Object *objValue1, Object *objValue2){ となっていますが、引数がInteger型の場合なのでしょうか? Integer型の場合、String型と同じ不変オブジェクトの為、 期待される処理が行われません。 String型の場合ですが、下のURLを参考にしてみて下さい。 ご期待に添える回答でなかった場合、何度も投稿してすいません。

参考URL:
http://www.itarchitect.jp/technology_and_programming/-/27074-2.html
回答No.1

getterでの値が変わればいいのであれば、こんなのどうでしょうか? public class ObjectPair { private boolean isBoo = true; private Object objValue1 = null; private Object objValue2 = null; public void ReplaceValue(){ isBoo = !isBoo; } public Object getObjValue1() { return isBoo ? objValue1 : objValue2; } public void setObjValue1(Object objValue1) { this.objValue1 = objValue1; } public Object getObjValue2() { return isBoo ? objValue2 : objValue1; } public void setObjValue2(Object objValue2) { this.objValue2 = objValue2; } } フラグで、getする値を決定します。

den2007
質問者

補足

この方法でも悪くはないのですが、私としては、C や Visual Basic のような参照渡しができる言語で関数に参照渡ししたようなものをイメージしています。 function void Replace(Object *objValue1, Object *objValue2){ } 見たいな感じです。 こういうのを Java では、どうやるのでしょうか? できないことにも理由があると思いますので、なぜできないのかが知りたいです。

関連するQ&A

  • Javaで単方向リスト作成に行き詰まり

    Javaで単方向リストを作成しようとしているのですが、append()で1件目のvalueやnextの値をアクセスするにはどうしたらいいか分かりません。ちなみにmain関数は変更しなくていいようです。 class Chain{ public static void main(String args[]){ //1件目のノードの作成 if(args.length == 0){ System.out.println("パラメータを指定してください"); return; } Node start = new Node(Integer.parseInt(args[0])); //2件目のノード作成 for(int i = 1; i < args.length; i++){ start.append(Integer.parseInt(args[i])); } } } class Node{ //メンバ変数(インスタンス変数) private int value; private Node next; //コンストラクタ public Node(int value, Node next){ this.value = value; this.next = next; } public Node(int value){ this.value = value; } public Node(){ this.value = 0; this.next = null; } //アクセスメソッド(setter, getter) public int getValue(){ return value; } public void setValue(int value){ this.value = value; } public Node getNext(){ return next; } public void setNext(Node n){ this.next = n; } //通常のメソッド //追加する public void append(int v){ Node chain = new Node(); chain.value=chain.getValue(); System.out.println(chain.value); } }

    • ベストアンサー
    • Java
  • 実行の順番を教えてください。

    現在JAVAの学習をおこなっていて、参考書で勉強しています。 しかし、以下の3つのソースコードはどの順番で実行されているか理解できておりません。 すみませんが、実行の順番を教えて頂けないでしょうか。 実行の順に数字を振ったりしていただけますと特に嬉しいです。 お願いします。 ※サンプル1 class testA{ testB b; testA(){ b=new testB(this); } } class testB{ testA a; testB(testA a){ this.a=a; } } class testAll{ public static void main(String args[]){ new testAll().banana(); //ソースコード } void banana(){ testA test = new testA(); } } ※サンプル2 public class A{ public static void apple(Integer i){ int ta =i.intValue(); ta+=3 ; i=new Integer(ta); } public static void main(String args[]){ Integer i = new Integer (0); apple(i); System.out.println(i.intValue()); } } ※サンプル3 public class Test{ public static void main (String args[]){ class orange{ public int i =9; } Object o=(Object)new orange(); orange orange = (orange)o; System.out.println("i="+orange.i); } }

    • ベストアンサー
    • Java
  • getter、setterメソッドを活用したいです

    Javaのgetter、setterメソッドをうまく使って、下記のコードを実行しようとしたのですが。 ---------------- package javatest; public class Jidosha { private int num; private double gas; public void setNum(int num) { this.num = num; } public void setGas(double gas) { this.gas = gas; } public int getNum() { return num; } public double getGas() { return gas; } public static void main(String args[]) { System.out.println("この車のナンバーは" + num + "です。"); System.out.println("この車のガソリンが入る最大量は " + gas + "です。"); } } ---------------- Eclipse上では「System.out.println・・・」のところで「非 static フィールド gas を static 参照できません」といったエラーが出てきまして。 getter、setterメソッドをうまく活用して「この車のナンバーは××××です」「この車のガソリンが入る最大量は〇〇〇〇です。」という文を出力するには、どう書けばよいでしょうか。 よろしくお願い致します。 ※OKWAVEより補足:「Webシステム開発」についての質問です。

    • ベストアンサー
    • Java
  • メソッド

    public class Point{ public int x; public int y; public void swap(int s){ int x = s * y; y = s * x; this.x = x; } public void swap2(int s){ int x = s * y; y = s * this.x; this.x = x; } public static void main(String[] args){ Point pt = new Point(); pt.x = 3; pt.y = 4; pt.swap(2); System.out.println(pt.x + " " + pt.y); pt.swap2(3); System.out.println(pt.x + " " + pt.y); } } このプログラムでswapメソッドとswap2メソッドってどう違うんですか?

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • GetterとSetterをやったのに。

    以下のプログラムを実行すると、フィールドA.aは不可視です。メソッドtestは型Aで不可視です。というエラーが出てきます。本に書いてあるとおり、やったのですが、どうしてダメなのかわかりません。ぜひ教えてください。 public class Sample { public static void main(String[] args) { A aa=new A(); System.out.println(aa.a); aa.test(); } } class A{ private String a = "A"; private void test(){ System.out.println("Test"); } public String getA() { return a; } public void setA(String a) { this.a = a; } }

    • ベストアンサー
    • Java
  • フィールドを持たないクラスが、値を保持できる理由

    なぜint型フィールドを持たないMyGenericsクラスが変数やリテラルを保持できるのでしょうか? Objectクラスのフィールドを持っていますが、Objectクラスも、 フィールドは持っていませんよね?メソッドも空のObject()しか持っていないですし。 一応、javadocを読んだのですが、読み方間違えていますか? http://dlc-cdn.sun.com/jdk/jdk-api-localizations/jdk-api-ja/builds/latest/html/ja/api/index.html --------------------code-------------------------------- public class MyGenericsTest { public static void main(String[] args) { int x = 234; MyGenerics g = new MyGenerics(x); Integer i = (Integer)g.get(); System.out.println(i); } } class MyGenerics { Object o; public MyGenerics(Object o){ this.o = o; } public Object get(){ return o; } }

    • ベストアンサー
    • Java
  • メソッドのオーバーライド(java)

    class A3{ void hello(){ System.out.println("A3"); } void hello(int i){ System.out.println("A3"+i); } } class B3 extends A3{ void hello(){ System.out.println("B3"); } } class C3 extends B3{ void hello(String s){ System.out.println("C3"+s); } } class MethodOverriding3{ public static void main(String args[]){ A3 obj = new C3(); obj.hello(); } } 上のプログラムを実行すると"B3"と表示されまが、どうしてクラスBのメソッドが実行されるのでしょうか? クラスAのメソッドが無視される仕組みがわかりません。 また、クラスMethodOverriding3でobj.hello("abc")としてコンパイルすると mo.java:25: シンボルを見つけられません。 シンボル: メソッド hello(java.lang.String) 場所 : A3 の クラス obj.hello("abc");   ^ エラー 1 個 とエラーが出ます。 どうしてでしょうか? 誰か教えてください、お願いします。

    • ベストアンサー
    • Java
  • 再帰メソッドについて

    いつもお世話になっております。 再帰メソッドについて質問があります。 後述のプログラム実行後、以下の結果が 得られました。 ********** depth = [0] , value = [0] ********** depth = [1] , value = [1] ********** depth = [2] , value = [2] ########## depth = [2] , value = [3] …★ ########## depth = [1] , value = [3] recursionMethod() は3回呼ばれました。 (以下、ソース) public class RecursionTest { private static final int MAX_DEPTH = 2; private static int cnt = 0; private int val =0; public static void main(String[] args) { // 再帰メソッドの呼び出し RecursionTest own = new RecursionTest(); own.recursionMethod(0); System.out.println("\n recursionMethod() は" + cnt + "回呼ばれました。"); } private void recursionMethod(int depth) { // 再帰メソッドが呼ばれた回数をカウントする cnt++; System.out.println("********** depth = [" + depth + "] , value = [" + val + "]"); val++; // パラメータ depth が MAX値に到達したら、return する if (depth++ >= MAX_DEPTH) { return; } // 自分自身の呼び出し recursionMethod(depth); System.out.println("########## depth = [" + depth + "] , value = [" + val + "]"); } } 実行結果の★以降が得られる理由が全く分かりません。 ・return で main() に戻るはずなのになぜ「###~」のログが出力されるのか ・depth の値がなぜデクリメントされるのか (誰がデクリメントの処理をしているのか) そもそも上記の結果を返すことが「メソッドの再帰的呼び出し」ということなのでしょうか? ご教授頂ける方がいらっしゃいましたら、宜しくお願い致します。

    • ベストアンサー
    • Java
  • コンストラクタからメソッドを呼んではいけない?

    会社の先輩から、 「コンストラクタでメソッドを呼ぶな!」をいわれ 理由も聞かずにソースを修正したのですが、 なぜコンストラクタからメソッドを呼んではいけないのでしょうか? 例: public class MyClass{ public MyClass(){ test(); } private void test(){ System.out.println("test"); } } よろしくお願いします。

    • ベストアンサー
    • Java