基本情報18年秋のJava問題問12の設問1(a)の問でわからないことがあるので教えてください。
スーパークラスを継承したクラスのコンストラクタ内の処理を、スーパークラスのコンストラクタと同じ処理する場合の記述についてです。
問題と解答(http://www.jitec.jp/1_04hanni_sukiru/mondai_kait …はここですが、簡単に書くと、次のようになります。
抽象クラスBook
abstract class Book {
String name;
String id;
Book(String name, String id) {
this.name = name;
this.id = id;
}
~
}
Bookを継承したRegularBook
class RegularBook extends Book {
RegularBook(String name, String id) {
ここが穴埋め ;
}
~
}
穴埋めの解答群5つのうちの2つが次のとおりです。
エ super(name, id)
オ this.name = name; this.id = id
もちろんエが正解です。
普通ここにエの記述をするのはわかるのですが、なぜ「オ」が「絶対に間違い」と言い切れるのかが分からないのです。
スーパークラスのコンストラクタ内の処理が変更になった場合、それを継承するクラスのコンストラクタの処理にも反映されるとか、そういう意味でもエの書き方は便利だとは思いますが、オも絶対に間違いといいきれないのでは??
お尋ねしたいのは、情報処理試験の問題として、絶対に間違いでない選択肢を2つ以上もいれるはずもないので、オは「なにがなんでも間違い」なんだろうけれどもその理由が分からないのです。
オが確実に間違っているという理由が分かりましたら教えてください。よろしくおねがいいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
オは間違いです。
本来、サブクラスのコンストラクタは、その処理の最初でスーパークラスのコンストラクタを呼び出します。
スーパークラスのコンストラクタが複数ある場合、「どのスーパークラスのコンストラクタを呼ぶか」、
つまりどの引数のコンストラクタを呼ぶのか指定しないといけません。
ただ、一つだけスーパークラスのコンストラクタを省略できる場合があります。
それが、スーパークラスの引数なしのコンストラクタ、つまり「super();」を呼ぶ場合です。
このコンストラクタを呼び出す場合に限り、スーパークラスのコンストラクタの呼び出しを省略できるのです。
(サブクラスのコンストラクタと同じ引数のコンストラクタではない、というのが重要です。
冷静に考えれば当然のことですが。)
言い換えると、引数のないコンストラクタ「以外」を呼ぶ場合は、明示的に記述しないといけません。
というのがJavaの言語仕様です。
これでお分かりでしょう。
RegularBookクラスのスーパークラスBookクラスにはBook()というコンストラクタがありません。
Book(String, String)というコンストラクタしかありません。
なので、RegularBook クラスのコンストラクタは、super(String, String)を必ず定義しないといけないのです。
No.1
- 回答日時:
ま、実際に手を動かすのが早いと言う事で、
提示していただいたサンプルでコンパイルすると「暗黙的スーパー・コンストラクター Book() は未定義です。別のコンストラクターを明示的に呼び出す必要があります。」というエラーがでてきました。
ま、そのまんまということで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- Java java final 1 2022/06/10 22:49
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- アプリ Android studio 初心者 Hello Android!しか表示されない 1 2023/08/01 08:47
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
内部クラスから別の内部クラス...
-
クラス間でのデータ参照
-
Java リフレクションについて
-
javaの配列について質問です。
-
SwingでgetContentPaneのエラー...
-
C#のクラスライブラリでメッセ...
-
C#でほかのファイルにある自作...
-
super.paint(g)を呼び出す意...
-
構造 他のクラスの構造体を別...
-
C++でfriendクラスにしているの...
-
範囲外の数値を代入したらエラ...
-
無名パッケージからのインポート
-
C++/C#間での構造体の引き渡し...
-
static変数を持ったクラスを継...
-
内部クラスのインスタンスを外...
-
dllエクスポート時のdeclspec(d...
-
親クラスから子クラスへアクセス。
-
Strategyパターンを用いた実装...
-
(クラス名.this.メソッド)って...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
関数内の変数に<summary>コメン...
-
c++,ある関数のクラスから別の...
-
C#にて別クラスの関数を使いたい
-
java-別クラスの変数の使い方を...
-
C++でfriendクラスにしているの...
-
a href="..." とServlet
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
Java リフレクションについて
-
import と extends について
-
C#でほかのファイルにある自作...
-
C#のクラスライブラリでメッセ...
-
Java
-
アップキャスト、ダウンキャス...
-
無名パッケージからのインポート
-
違うクラスからの変数の共有化
-
SwingでgetContentPaneのエラー...
-
ひとつのファイルにクラスは1つ?
おすすめ情報