- ベストアンサー
最終的な呼び出し元(クラス、メソッド)を表示するにはどうしたらよいでしょうか?
- 現在、呼び出し元のクラスのPrintする方法を探しています。
- デバッグ用のメソッドをクラスに埋め込み、最終的な呼び出し元(クラス、メソッド)を表示します。
- 現在使っている方法では、クラスをたどった表示ができないため、他の方法を模索しています。
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- ArrayクラスとtoStringについて
問題集で次のプログラムを見掛ました。 public class Main{ public static void main(String args[]){ int[] array = new int[0]; System.out.println(array); } } これを実行するとprintlnメソッドで toStringメソッドが呼び出されますが、 ArrayクラスはObjectクラスを継承しているため、 toStringメソッドもObjectクラスから継承されているので、 結果として、配列の要素数が0であっても、 エラー等が発生せずハッシュコードが表示される、ということです。 ObjectクラスのtoStringメソッドが ハッシュコードを返すものであるのは理解できます。 でも、なぜ要素数が1以上で何かしらの要素が存在する場合は、 ハッシュコードが返らないのでしょうか? 詳しい方、解説をお願いします。
- 締切済み
- Java
- Exceptionクラスの継承について
Exceptionクラスを継承しているExceptionMがありますが、その中にsuper(message)というものがあります。 これは、スーパークラスのExceptionがmessageという変数を引数で受けることができるメソッドを使用していることは分かりますが、実際何を行っているのでしょうか? そして、この処理によって何を得ているのでしょうか? あと、try{のなかにtry{という変な記述していますが、問題でそうかかれていただけなので気にしないでください。 問題箇所 class ExceptionM extends Exception{ public ExceptionM(String message){ super(message); } } 全ソース class ExceptionSubclassQuestion{ public static void main(String args[]){ a(); } static void a(){ try{ try{ throw new ExceptionM("M"); }catch(ExceptionN e){ System.out.println("lnner catch"); e.printStackTrace(); } }catch(ExceptionM e){ System.out.println("Quter catch"); e.printStackTrace(); } } } class ExceptionM extends Exception{ public ExceptionM(String message){ super(message); } } class ExceptionN extends ExceptionM{ public ExceptionN(String message){ super(message); } }
- ベストアンサー
- Java
- スーパークラスについて
下記のソースコードについて、質問がありますので記載致しました。 class TooYoungException extends Exception { TooYoungException(String message) { ------------------------ super(message); ------------------------ } } class AdultMember{ private String name; private int age; void setAge(int age) throws TooYoungException{ if (age > 18) { this.age = age; } else { throw new TooYoungException("年齢が低すぎます:" + age); } } int getAge() { return this.age; } } class Test{ public static void main(String args []) { AdultMember adm = new AdultMember(); try { adm.setAge(Integer.parseInt(args[0])); System.out.println("年齢を設定しました"); }catch(TooYoungException tme) { System.out.println(tme.getMessage()); } } } [質問内容] -----でかこってある部分の super(message) になりますが、 何故、この部分に throw new TooYoungException("年齢が低すぎます:" + age); の("")の文字が入り、文字が表示されることになるのでしょうか? とりわけ、superが指し示しているもの(Exceptionがスーパークラスに なると思われますが)はどれになるのでしょうか。 理解しきれていない部分が多数ありますが、ご教授の程お願い致します。
- ベストアンサー
- Java
- 親クラスから子クラスへアクセス。
親クラスから子クラスへアクセス。 お世話になります。 以下のプログラムについて考えています。 public class Main{ public static void main(String[] args) { SubA subA = new SubA(); SubB subB = new SubB(); Super[] subs = {subA,subB}; subs[1].method(); subs[2].method(); } } class Super{ String str = "親"; public void method(){ System.out.println(str); } } class SubA extends Super{ String str = "子A"; } class SubB extends Super{ String str = "子B"; } この場合、出力結果は当然 親 親 になります。 これを子クラスの str を表示するようにしたいのです。つまり 子A 子B です。 ただし、子クラスで method() をオーバーライドしたり、super.str = "子A" のように親クラスを書きかえずにです。 子クラスが何百種類もある場合、全く同じmethod()を書く無駄や、変更があったときにそれを全てを修正しなければならないことを避けたいのです。 何か良案がありましたら、ぜひご教授ください。よろしくお願いします。
- 締切済み
- Java
- クラスメソッドについて
Kakeibo クラスにあるsyojikin(初期値0)をprivate フィールドとし、その代わりにクラスメソッドshowSyoji(戻り値、引数無し)を用意して、下記のプログラムを作成したのですがクラスメソッドのshowSyojiがうまく回りません。これはもしかしてクラス変数も必要なのですか(privateもつけて)?また、このプログラムはどのようなプログラムになるのですか? class Kakeibo { private int year; private int month; private int date; private int syunyu; private int shisyutsu; private int syojikin; private Kakeibo() { year = 0; month = 0; date = 0; syunyu = 0; shisyutsu = 0; syojikin = 0; } public Kakeibo(int y, int m, int d, int sy, int sh) { this(); if(sy>=0 && sh>=0){ year = y; month = m; date = d; syunyu = sy; shisyutsu = sh; } else{ System.out.println("入力した金額は無効です。"); } } public static void showSyoji() { System.out.println("所持金:"+syojikin+"円"); } public void showData() { System.out.print(year+"年"+month+"月"+date+"日:収入"+syunyu+"円、支出"+shisyutsu+"円\n"); } } class KNO5 { public static void main(String args[]) { Kakeibo.showSyoji(); //Kakeibo kakeibo1 = new Kakeibo(); //kakeibo1.showData(); Kakeibo kakeibo2 = new Kakeibo(2010, 12, 1, 3000, 500); kakeibo2.showData(); Kakeibo kakeibo3 = new Kakeibo(2010, 12, 1, -5000, 300); kakeibo3.showData(); Kakeibo kakeibo4 = new Kakeibo(2010, 11, 7, 0, 1000); kakeibo4.showData(); Kakeibo kakeibo5 = new Kakeibo(2010, 11, 18, 100, 800); kakeibo5.showData(); Kakeibo.showSyoji(); } }
- ベストアンサー
- Java
- mainクラスのpublicの意味を教えて下さい
お早う御座います、JAVA初心者です、宜しくお願いします。 main クラスの public をコメントアウトしてもエラーもなく走ります。 これは、「public static void main(String[] args)」を持っているクラスを自動的に「main クラス」と判断しているということでしょうか。 ============================================================ class Sub { void disp() { System.out.println(" a "); } } /*public*/ class Main { public static void main(String[] args) { Sub s = new Sub(); s.disp(); } }
- ベストアンサー
- Java
- インターフェイス実装クラスの表示について
/* インタフェースPlanetを実装したクラスEarth、Marsがあります。 以下の実行結果になるようにクラスAggregateへshowメソッドを 追加してください。 [実行結果] 地球 太陽系にある惑星の1つで、太陽から3番目に近い。・・・ 火星 太陽系の太陽に近い方から4番目の惑星である。・・・ */ // [Planet.java] // 実装したいPlanetクラス interface Planet { public String getName(); public String getOutline(); } // Planetを実装したEarthクラス // [Earth.java] class Earth implements Planet { private final String name="地球"; // getNameメソッド:戻り値String、引数無し public String getName(){ return name; } // getOutlineメソッド:戻り値String、引数無し public String getOutline(){ return "太陽系にある惑星の1つで、太陽から3番目に近い。・・・"; } } // Planetを実装したMarsクラス // [Mars.java] class Mars implements Planet { private final String name="火星"; // getNameメソッド:戻り値String、引数無し public String getName(){ return name; } // getOutlineメソッド:戻り値String、引数無し public String getOutline(){ return "太陽系の太陽に近い方から4番目の惑星である。・・・"; } } // メインクラス // [Main.java] class Main{ public static void main(String[] args){ // Earth&Marsクラスのインスタンス化 Earth earth = new Earth(); Mars mars = new Mars(); // Aggregateクラスのインスタンス化 Aggregate aggregation = new Aggregate(); // showメソッド呼び出し:戻り値無し、引数earth・mars aggregation.show(earth); aggregation.show(mars); } } // [Aggregate.java] class Aggregate { // ここにshowメソッドを追加 public void show(Earth planet){ System.out.println(); } public void show(Mars planet){ System.out.println(); } } showメソッドに引数としてEarth planet,Mars planetを渡すというところまでは理解しています。後は星の名前と概要を表示するのですが、例えば、 showメソッド内 // ここにshowメソッドを追加 public void show(Earth planet){ String str = earth.getName(); System.out.println(str); } public void show(Mars planet){ String str2 = mars.getOutline(); System.out.println(str2); } } とすると、erathとmarsの部分が「シンボルがありません」のエラーになります。自分の認識としては、EarthクラスとMarsクラスでフィールド変数を宣言しているので使えるのでは?と思っていたのですが、全然違うようです。どなたかどちらかのコード例を表記して頂けないでしょうか?よろしくお願い致します。
- ベストアンサー
- 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
- 二つの変数の値を入れ替えるメソッドを作成できますか?
メソッドに二つの同じ型の変数を渡し、その値を入れ替えるメソッドを作りたいのですが、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
- 動的に変数をセット後他クラスから参照する場合
コンストラクタで変数にセットした後 他のクラスでインスタンスを生成することなく セットした変数を参照したいのですが、 staticにすると、他クラスで変数を変更することも できてしまいます。他の方法がありますでしょうか? 変数はprivateにして、getterで取得するという方法も 考えられますが、static finalな変数として扱う方法が あるか、お分かりの方いらっしゃいましたら教えてください。 Javaを初めて1ヶ月なので、見当違いの質問でしたらご指摘ください。 例) Class A{ static final String aaa; A(String paraStr){ aaa = paraStr; } } Class B{ static void main(String[] args){ new A("test"); } } Class C{ void chStr(){ System.out.println(A.aaa); A.aaa = "changeStr" System.out.println(A.aaa); } } 期待する値 test test もしくは、実行時にfinalの値は変更できない等のException 宜しくお願いします。
- ベストアンサー
- Java
お礼
ありがとうございます! 直接の呼び出し元が分かるようになりました。