Javaの認定資格「Oracle Certified Java Programmer, Gold SE 7」。通称JavaGoldのオリジナル問題を紹介していきたいと思います。
前回の解答
まずは、前回の解答から。
正解は「(2)(3)(6)」となります。
それぞれの選択肢を順番に検証していきましょう。
まずは「(1) ExStringのインスタンスをStringクラスの変数に代入できない」ですが、これはコンパイルエラーの直接的な原因ではありません。サブクラスのインスタンスをスーパークラスの変数へ代入することができる(=ポリモーフィズム)というオブジェクト指向の基本的なルールに則っていますので問題ありません。
覚え方はいろいろありますが、私の場合はイコールの右辺と左辺で大小関係を考え、「左辺の方が大きい場合は代入できる」と考えています。変数は入れ物なので中身(=右辺)より入れ物が大きければ入る(=代入できる)というイメージです。
スーパークラスとサブクラスではスーパークラスの方が大きいというイメージが持てるかどうかもポイントになります。
次に「(2) Stringクラスを継承してクラスを作ることはできない」ですが、これはコンパイルエラーの原因となっています。JavaSE7のAPIリファレンスを見てみると、Stringクラスにはfinal修飾子が付いているため、サブクラスを作ることができないのです。
StringクラスのAPIリファレンス(Java SE 7)
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
次の「(3) Integerクラスを継承してクラスを作ることはできない」に関しても同様です。
このように主要なクラスについては、final修飾子が付いているのかどうかは覚えておきたいところです。
次に「(4) Numberクラスを継承してクラスを作ることはできない」ですが、これはコンパイルエラーの直接的な原因ではありません。Numberクラスは基本データ型のラッパークラス(Byte、Short、Integer、Long、Float、Double)のスーパークラスです。これらのラッパークラスを共通的に扱えるように作られているクラスのため、継承して使用することが前提となっているクラスになります。
次に「(5) ExNumberクラスにはabstract修飾子をつける必要がある」と「(6) ExNumberクラスではいくつかのメソッドをオーバーライドしなくてはいけない」ですが、Numberクラスは継承して使用することが前提となっているクラス(=抽象クラス)であり、抽象メソッドを複数個もっているクラスになります。具体的にはintValue()メソッドやfloatValue()メソッドがそれに当たり、サブクラスとなるExNumberクラスではこれらのメソッドをオーバーライドするか、ExNumberクラス自身にabstract修飾子をつける必要があります。しかし、abstract修飾子をつけるとそのクラスはnewできなくなってしまい、7行目に何らかの修正を加える必要がでてきてしまうためコンパイルエラーの原因としては(6)の方が適当と考えられます。
問10
次のプログラムの実行結果として正しいものを1つ選んでください
package techpjin; public class Lesson10 { public static void main(String[] args) { Bike b1 = new Bike(); Bike b2 = new Bike(); b1.up(10); b2.up(30); b1.change("honda model2"); System.out.println("b2の車種:" + b2.model); } } class Bike{ public static String model = "honda model1"; private int speed = 0; public int up(int sp){ return speed += sp; } public static void change(String after) { model = after; } }
- b2の車種:honda model1
- b2の車種:honda model2
- 8行目、9行目でコンパイルエラーが発生する
- 11行目、12行目でコンパイルエラーが発生する
- 実行時エラーが発生する
問10の解答・解説と問11はこちら