- ベストアンサー
スーパークラスについて
下記のソースコードについて、質問がありますので記載致しました。 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がスーパークラスに なると思われますが)はどれになるのでしょうか。 理解しきれていない部分が多数ありますが、ご教授の程お願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
特にExceptionのコンストラクタなんて意識したことが無かったので、いい機会なので調べてみました。 Java 1.4 を逆コンパイルしてソースを見てみました。 public Exception(String message) { super(message); } まぁつまりExceptionのスーパークラスである、Throwableのコンストラクタを呼び出していますね。 では、Throwableでは? public Throwable(String message) { fillInStackTrace(); detailMessage = message; } フィールドであるdetailMessageに引数messageを単純にセットしていました。 同時にThrowableのメソッドgetMessage()は public String getMessage() { return detailMessage; } でした。ちょっと違いますがKGMさんの想像していたこととほぼ同じようなものです。(ただしdetailMessageはprivateでした。) : : まぁ勉強のためというのならわかりますが、そこまで内部の処理を理解しなくてもよいのでは?と思います。それもオブジェクト指向のよいところでしょうから。Java API Documentを参考にしながら使うことでもいいのではないでしょうか?
その他の回答 (3)
- pcbeginner
- ベストアンサー率46% (261/560)
ご参考までに。 Javaで提供されているクラスのソースなら、インストール時に選択すれば、src.zip(だったかな?)がインストールできますよ。 それを解凍すれば、OKです。 ただし、コメントは全部は英語ですが…。 日本語版JavaDocと合わせて見れば、勉強になると思います。
お礼
なるほどです。 英語の勉強にもなりますね^^ ありがとうございます。
- braver_2004
- ベストアンサー率62% (20/32)
No1の方がコンストラクタで構築、といっていますよね。 メソッドではなくコンストラクタです。 コンストラクタとはインスタンスを生成する際に必ず呼び出されるものです。つまり、TooYoungExceptionのコンストラクタ内でsuperクラスであるException のコンストラクタを呼び出しているのです。
補足
superはExcepionのコンストラクタを呼び出しているのですね^^ つまり、Excepionのコンストラクタを呼び出したことで、 messageに値が代入されたことになるのですか??? super(message)の部分では super.message = message という処理が行なわれていることになるのでしょうか? 上記のような、処理がなければString型の変数messageに値が 代入されないと思われます。 もう少しで理解できるところまで到達しておりますので、 お手数ですがご教授の程、お願い致します。
- pcbeginner
- ベストアンサー率46% (261/560)
Exceptionクラスのコンストラクタ Exception(String message) 指定された詳細メッセージを使用して、新規例外を構築します。 です。 ちなみに tme.getMessage() は、更に親のクラスであるThrowableクラスのメソッド getMessage() この Throwable オブジェクトの詳細メッセージ文字列を返します。 です。
お礼
ご丁寧な説明をしていただき、まことにありがとうございます。 前半のコンストラクタについて、まだ理解度が足りなかったようです。 書き込みありがとうございます!!
補足
super(message)にて superはExceptionクラスのどのメソッドを使って 新規例外を構築しているのでしょうか?? 誠に申し訳ございませんが、再度ご教授の程お願い致します。
補足
なるほどです。 ちょっと、考えすぎてしまいました。。。 superだけで、どう機能するのかさっぱりわかりませんでしたので。。。 非常に助かりました。