<<4.クラスの基礎の目次
コンストラクタ
問題1(難易度:2)                            2004年11月5日
次の説明のうち正しいものを選びなさい。(複数選択)
 
  A.. コンストラクタの名前はクラス名と同じでなければならない。
  B. コンストラクタは戻り値として、引数の数を、int型の値として返さなければならない。
  C. コンストラクタに引数はあってはならない。
  D. コンストラクタのアクセス指定は、publicでなければならない。
  E.. コンストラクタはクラス内のほかのメソッドより前になければならない。
  F. コンストラクタはひとつのクラス内にいくつあってもよい。

                         
解説
 まずAは○。必ずクラス名と一致させなければなりません。大文字小文字も区別されます。クラス名Testのコンストラクタをtestとすると、普通のメソッドとして扱われ、戻り値の型がありませんなどのコンパイルエラーになります。

 Bは×。コンストラクタには戻り値はありません。普通のメソッドでは、戻り値なしはvoid指定ですが、それも指定できません。指定すると普通のメソッドとして見なされてしまいます。void指定の、クラス名と同じメソッド名を使うという、そんな紛らわしいことはやめましょう。

 Cも×。引数は指定できます。よくインスタンス変数の初期値などを設定するために使います。

 Dも×。public指定できますが、他にprotected、privateの指定もできます。何もアクセス指定しないことも可能です。このへんは普通のメソッドと同じです。

 Eも×。メソッドやコンストラクタの記述順は、任意でかまいません。実行順とはなんら関係ありません。

 Fは○。シグネチャ(引数の型や個数、並び順)が異なるもので、オーバーロードができます。

正解 A F

参考 読み物Java 第9章 第10章 第11章

<<4..クラスの基礎の目次次問題>>
問題6(難易度:1)                           2004年11月12日
 次のクラスAの(*)に追加できるコンストラクタを、下から選びなさい。

   public class A {
           private int x;
            (*)
   }

        
        A. int A() {
                 return x;
           }
        
        B. public a() {
                 x = 0;
           }
        
        C. private A() {
                 x = 1;
           }
        
        D. public A(int x) {
                 x = x;
           }
解説 
 Aは戻り値の指定があります。これはいけない、コンストラクタは戻り値の指定はできません。voidでもだめです。もちろんreturnで値を返すこともできません。
 
 Bは戻り値はありませんが、コンストラクタ名が「a」とクラス名と異なるためだめです。大文字小文字も区別されます。

 CはOKです。コンストラクタがprivate指定なんて、と思われる方もいるかもしれません。オブジェクトの生成を制限したい場合にこのようにします。

 Dは「x=x;」の部分でエラーになります。仮引数とインスタンス変数のどちらもxなので困ります。こんな場合、単に「x」とメソッドの中で使っていれば、それは仮引数のxを意味する取り決めになっています。こんなときは頭に「this.」をつけましょう。「x=x;」を「this.x=x;」とすればOKです。


解答 C

参考 読み物Java 第9章 賢い長方形
 
<<4..クラスの基礎の目次次問題>>
問題20(難易度:1)                            2005年4月27日
次のクラスAがあるとき、そのコンストラクタの呼び出しで正しいものを下から選べ。

   public class A {
           private double x;
        
           public A(int x) {
                   this.x = x;
           }
        
           public A(int x, double y, int z) {
                   this.x = x + y - z;
           }
   }

       A. A a = new A();
       B. A a = new A(3);
       C. A a = new A(1.5);
       D. A a = new A(1, 2.5);
       E. A a = new A(1, 2, 3);
解説
 クラスに引数つきのコンストラクタが定義されていると、デフォルトコンストラクタは生成されません。よってAは×。
 Bは○ですが、Cは実引数がdouble型で、仮引数の型intと一致せず×。
 Dは実引数の数が2個で、そのようなコンストラクタは存在せず×。
 Eは2番目の実引数が2でint型ですが、これは対応する仮引数の型doubleに拡大変換(→問題2−10)できるのでOKです。 
解答
B E
問題21(難易度:2)                                2005年4月28日
 次をコンパイル、実行するとどうなるか。下から選べ。
   1: public class Test {
      2:     private int x;
        
      3:     public Test(int x) {
      4:     }
        
      5:     private Test() {
      6:             x = 3;
      7:     }
        
      8:     public int test() {
      9:             return x--;
    10:       }
                
    11:     void test(int y) {
    12:             x = y;
    13:     }
        
    14:     public static void main(String[] args) {
    15:             Test t1 = new Test(10);
    16:             Test t2 = new Test();
    17:             t1.test();
    18:             t2.test(20);
    19:             System.out.println("t1=" + t1.x + " t2=" + t2.x);
    20:     }
  21: }

  A. 4行目、5行目でコンパイルエラーになる。
  B. 8行目、11行目でコンパイルエラーになる。
  C. t1=-1 t2=20 と出力される
  D. t1=10 t2=3  と出力される
  E. t1=9 t2=20  と出力される
解説
 クラスTestには、コンストラクタが二つ、メソッドtestが二つあります。ひとつずつ見ていきましょう。

 3、4行目のコンストラクタは、本体部分で何も行っていませんが、これは問題ありません。インスタンス変数xの値は何も代入されなければ0になります。(→第12章 いきなり使うと...)15行目終了時点で、t1.xは0になります。

 5〜7行目のコンストラクタは、privateになっていますが、これも問題ありません。クラスの中のmain、16行目で呼ばれています。インスタンス変数xには3が代入されるので、16行目終了時点で、t2.xは3になります。

 8〜10行目のメソッドは、名前がtestですが、先頭が小文字なのでコンストラクタではなく、普通のメソッドと見なされます。演算子「−−」は、変数の値を1だけ減らすので、17行目でt1.xの値は−1になります。

 11〜13行目のメソッドでは、先ほどのメソッドと同名ですが、仮引数がひとつあります。18行目ではこちらが呼び出され、t2.xの値は実引数の20になります。メソッド名のオーバーロードを利用しています。(→第11章 同じ顔した別人

 よって解答はCになります。

解答


参考  第9章 第11章 第12章
<<4..クラスの基礎の目次次問題>>
Copyright (c) 2004 Nagi Imai All Rights Reserved..