<<5.継承の目次
継承の基本
問題1(難易度:1)                                  2005年5月4日
次のクラスTestのサブクラスとして、文法的に正しいものを下から選べ。
   public class Test {

   }

   A.class A extends Test {

     }
   B.public class B implements Test {
        
     }

   C.public class C extends new Test() {

     }

   D.public class D extends Test throws Exception {

     }
解説
 どのクラスのサブクラスかを示すには「extends」の後にクラス名を指定するのでしたね。
 Aは正解ですが、Bは誤りです。「implements」はinterfaceを実装する場合に使用します。またCももちろん間違え。こんな所でオブジェクト生成はできませんん。
 
 Dの「throws Exception」はメソッドに指定するもので、クラスには指定できません。よって×。

解答


参考 第13章
問題2(難易度:2)                               2005年5月19日
次の二つのクラスがある。クラスBのメソッドmainを実行するとどうなるか。下から選べ。

   1: public class A {
     2:    int a;
      3:     A(int x) {
      4:             a = x;
      5:     }
   6: }
   1: public class B extends A {
      2:     B() {
      3:             System.out.println("B");
      4:     }
        
      5:     public static void main(String[] args) {
      6:             B b = new B();
      7:     }
   8: }


 A.Bと出力される。
 B.0と出力される。
 C.正常に実行されるが何も出力されない。
 D.コンパイルエラーになる。
   
解説
 クラスBのコンストラクタの中身はいきなり出力なので、スーパークラスの引数なしのコンストラクタ「super();」がその前に(2行目と3行目の間)自動的に挿入されます。
 さてスーパークラスAのコンストラクタは引数が1個のものはありますが、引数なしのものはありません。またコンストラクタがひとつでも定義されていると、引数なしのデフォルトコンストラクタが自動的に生成されることはありません。そこでクラスBからの先ほどの「super();」の呼び出しはエラーになります。よって解答はD。

解答 
D

参考 第15章 
問題3(難易度:2)                                2005年5月20日
次の二つのクラスがある。クラスBのメソッドmainを実行するとどうなるか。下から選べ。

   1: public class A {
      2:   int a;
      3:    A() {
      4:          a = 1;
      5:    }
        
      6:    A(int x) {
      7:          a = x;
      8:    }
   9: }
   1: public class B extends A {
      2:    B() {
      3:          System.out.println(a);
      4:    }
        
      5:    public static void main(String[] args) {
      6:          B b = new B();
      7:    }
   8: }


 A.0 と出力される。
 B.1 と出力される。
 C.正常に実行されるが何も出力されない。
 D.コンパイルエラーになる。
解説
 前問同様、クラスBのコンストラクタはいきなり出力なので、スーパークラスAの引数なしのコンストラクタ「super();」が頭に挿入されます。今回はクラスAに引数なしのコンストラクタ(3〜5行目)があるので、インスタンス変数aに1が代入されます。aはもちろんクラスBで継承されていますので、3行目のaの出力は1となります。

解答
B

参考 第15章
問題4(難易度:2)                            2005年5月21日
次の二つのクラスがある。クラスBのメソッドmainを実行するとどうなるか。下から選べ。

   1: public class A {
      2:    int a;
   3: }
   1: public class B extends A {
      2:    B(int b) {
      3:          System.out.println(a);
      4:    }
        
      5:    public static void main(String[] args) {
      6:          B b = new B(100);
      7:    }
   8: }

 A.0 と出力される。
 B.100 と出力される。
 C.正常に実行されるが何も出力されない。
 D.コンパイルエラーになる。
解説
 クラスBのコンストラクタは前問までと同じなので、クラスAの引数なしのコンストラクタが頭に挿入されます。
 一方クラスAにはひとつもコンストラクタがありません。こんなときには次のような、引数なしのデフォルトコンストラクタが自動的に生成されます。
   public A( ) {
     super( );
   }
 ここの「super( );」はクラスAのスーパークラスObjectのコンストラクタになります。つまりAのインスタンス変数aにはここでは何も代入されません。よってaの値は初期値0のままになり、Bのコンストラクタでの出力は0になります。

解答
A

参考 第9章 コンストラクタがないのに... 第15章
問題5(難易度:2)                           2005年5月22日
次の二つのクラスがある。クラスBのメソッドmainを実行するとどうなるか。下から選べ。

   1: public class A {
      2:    int a;
        
      3:    A() {
      4:          a = 1;
      5:    }
        
      6:    A(int x) {
      7:          a = x;
      8:    }
   9: }

   1: public class B extends A {
      2:    B(int b) {
      3:          super(b);
      4:          System.out.println(a);
      5:    }
        
      6:    public static void main(String[] args) {
      7:          B b = new B(100);
      8:    }
   9: }


 A.0 と出力される。
 B.100 と出力される。
 C.正常に実行されるが何も出力されない。
 D.コンパイルエラーになる。
解説
 前問までとちがって、今度はBのコンストラクタの最初に、スーパークラスAのコンストラクタの呼び出し「super(b);」がある。Aのコンストラクタは二つあるが、引数ひとつの6〜8行目のコンストラクタが呼ばれ、インスタンス変数aに実引数bの値100が代入される。よってクラスBの4行目では100が出力される。

解答
B

参考 第15章
<<5.継承の目次次問題>>
Copyright (c) 2004-2005 Nagi Imai All Rights Reserved..