<<4.クラスの基礎の目次
メソッド
問題4(難易度:1)                        2004年11月12日
 次のメソッドの宣言の中で、コンパイラを通るものはどれか選びなさい。

        A. public void protected foo1(int x) {
           }
        
        B. int foo2(int foo2) {
                  return foo2;
           }
        
        C. private void foo3(void) {
           }
        
        D. public double do(int p){
                    return p * 1.05;
           }
        
        E. void foo4() {
           }
解説
 順に見ていきましょう。
 まずAは、アクセス指定が「public」と「protected」二つあり、エラーになります。
 次にBは問題ありません。メソッド名と仮引数名は同じですが、使われる場所が異なるためコンパイラも区別できるので、同名のものでもかまいません。
 Cは仮引数のところに「void」の指定があるのでエラーです。仮引数がひとつもない場合は、括弧のみで中には何も指定しません。
 Dはメソッド名に「do」が使ってあり、これはJavaのキーワードでどの名前にも使えません。
 Eは問題ありません。


解答 B E

参考 読み物Java 第9章 賢い長方形
問題5(難易度:1)                                2004年11月12日
次のメソッドの宣言の中で、コンパイラを通るものはどれかを選びなさい。
        A. int foo1(long x) {
                return x;
           }

        B. long foo2(int x) {
                 return x;
           }

        C. char foo3(String str) {
                 return str.charAt(0);
           }

        D. String foo4() {
                 return "A" + 2;
           }

        E. int foo5() {
                return;
           }
解説
  Aでは仮引数xはlong型なので、returnではlongの値を返そうとしています。一方、戻り値の型は「int」になっていて、一致していません。この場合、代入と同じ規則が適用されます。覚えていますか?拡大変換(→2.演算子と制御文 問題10)はOKだけど、逆は許されませんでしたね。longからintへの変換は拡大変換ではありませんので、コンパイルエラーになります。
 BはAの逆で、return文ではintの値を返そうとしています。戻り値の型はlongの指定なので、intからlongに問題なく拡大変換されます。

 CのcharAtは文字列の中から1文字取り出すメソッドです。引数は0なので、strの先頭文字が取り出されます。戻り値の型は1文字格納できるcharなので問題ありません。

 Dのreturn文の式は、”A”が文字列なので、「2」が文字列”2”に変換され、文字列の+、つまり連結され”A2”になります。戻り値の型もStringなのでOKです。

 Eのreturn文には式の指定がありません。一方戻り値の型はintになっているので、何も返さないのは許されず、エラーになります。ちなみに戻り値の型が次のようにvoidであればOKです。さらにちなみに下のreturn文はなくてもOKです。

        void foo5() {
           return;
        }


解答 B C D

参考 読み物Java 第9章 賢い長方形 
<<4.クラスの基礎の目次次問題>>
問題7(難易度:1)                           2004年11月13日
 クラスAにメソッドfooが宣言されている。(*)の位置でfooを呼び出す。コンパイラを通るものを下から選べ。

public class A {
        public void foo(int x, float y) {
                System.out.println(x + " " + y);
        }

        public static void main(String[] args) {
                A obj = new A();
                short s = 5;
                  (*)
        }
}
    
    A. obj.foo('a', 1f);
    B. obj.foo(s, 0.1);
    C. obj.foo(s, 'a');
    D. obj.foo(12L, 0.1f);
    E. obj.foo(5, 5);
解説
 クラスをテストするとき、メソッドmainをそのクラスの中に入れて、そこで自分自身のオブジェクトを作り、他のメソッドのテストをすると、わざわざmainだけ含むクラスを作成しなくて済むので楽です。ここではそのやり方を使っています。mainを別クラスにした場合と中身は同じです。

 問題5で、returnの式の値の型と、戻り値の型として指定したものの関係をやりました。拡大変換(→2.演算子と制御文 問題10)ならばOKでしたね。今度は実引数の値の型と、仮引数の型の関係です。ここも拡大変換ならばOKです。(問題5とちがい代入可能ならOKとは言ってないのです。次の問題で明らかになりますが、ここまで意地悪な問題出るかなぁ...)

 ではAから見ていきましょう。呼び出しの実引数は、メソッド1行目の仮引数と図のように一対一に対応します。最初の実引数’a’はchar型なので、1番目の仮引数のint型に拡大変換できます。2番目はfloat型の定数です。これは2番目の仮引数にそのまま代入できます。よってAは○。
 
 次はB、第一実引数はshort型、これはintに変換可能、第二実引数は0.1で「f」も「F」も付かない小数点つきの数なので、double型の定数になり、これはfloatには拡大変換できません。よって×。
 
 Cは第二実引数がchar型の定数で、float型に拡大変換できるので○。

 Dは第一実引数が「L」の付いたlong型の定数なので、int型に拡大変換できず×。

 Eの第二実引数はint型の定数で、floatに拡大変換できるので○。


解答 A C E

参考 読み物Java 第9章 賢い長方形
問題8(難易度:3)                               2004年11月14日
 次をコンパイル、実行すると、結果はどうなりますか。下から選びなさい。

  1: public class A {       
    2:     public int boo(short s, byte b) {
    3:            return s + b;
    4:     }

    5:     public static void main(String[] args) {
    6:            A obj = new A();
               
    7:            short a = 2;
    8:            byte b = 3;
    9:            System.out.println(obj.boo(a, b));
                
  10:            System.out.println(obj.boo(2, 3));              
  11:      }
  12: }

  
   A.5 と出力される
     5
   B.3行目でコンパイルエラーになる
   C.7行目と8行目でコンパイルエラーになる
   D.9行目でコンパイルエラーになる
   E.10行目でコンパイルエラーになる
解説
 まずメソッドbooのreturnで返す値の型を調べましょう。sはshort、bはbyteなので、加算の前に二つの値がintに自動的に変換されて結果もintになります。戻り値の型の指定もintなので、ここは問題なくコンパイラを通ります。

 次は呼び出し側です。7行目と8行目については、int型の定数を、char、byte、shortのいずれかの変数に代入するのは、拡大変換でないが例外的にコンパイラが許してくれました。(→2.演算子と制御文 問題10)よってCは間違え。

 9行目の実引数は、shortとbyteなので、仮引数の型と一致し問題ありません。

 10行目も、この流れで行くとOKのような感じです。ところがいけません。7行目や8行目のような代入時の例外は、実引数から仮引数への変換については適用されないのです。実引数がintの定数なので、仮引数のshortやbyteに変換できず、コンパイルエラーになります。問題7で、「拡大変換可能ならOK」だが、「代入可能ならOK」とは言わなかったのは、この例外が引っかかったためです。でもここまで細かいことを気にしていると、白髪が増えそう。大体コンパイラが文句を言ってくれるので、ああそうかで済むことですものね。


解答 E



                <<4.クラスの基礎の目次次問題>>
Copyright (c) 2004 Nagi Imai All Rights Reserved..