問10この記事は2015年11月13日に書かれたものです。内容が古い可能性がありますのでご注意ください。通称JavaGoldのオリジナル問題を紹介していきたいと思います。前回の解答まずは、前回の解答から。正解は「(2)(3)(6)」となります。それぞれの選択肢を順番に検証していきましょう。ExStringのインスタンスをStringクラスの変数に代入できない」ですが、これはコンパイルエラーの直接的な原因ではありません。サブクラスのインスタンスをスーパークラスの変数へ代入することができる(=ポリモーフィズム)というオブジェクト指向の基本的なルールに則っていますので問題ありません。覚え方はいろいろありますが、私の場合はイコールの右辺と左辺で大小関係を考え、「左辺の方が大きい場合は代入できる」と考えています。変数は入れ物なので中身(=右辺)より入れ物が大きければ入る(=代入できる)というイメージです。スーパークラスとサブクラスではスーパークラスの方が大きいというイメージが持てるかどうかもポイントになります。Stringクラスを継承してクラスを作ることはできない」ですが、これはコンパイルエラーの原因となっています。JavaSE7のAPIリファレンスを見てみると、Stringクラスにはfinal修飾子が付いているため、サブクラスを作ることができないのです。Integerクラスを継承してクラスを作ることはできない」に関しても同様です。このように主要なクラスについては、final修飾子が付いているのかどうかは覚えておきたいところです。Numberクラスを継承してクラスを作ることはできない」ですが、これはコンパイルエラーの直接的な原因ではありません。Numberクラスは基本データ型のラッパークラス(Byte、Short、Integer、Long、Float、Double)のスーパークラスです。これらのラッパークラスを共通的に扱えるように作られているクラスのため、継承して使用することが前提となっているクラスになります。ExNumberクラスではいくつかのメソッドをオーバーライドしなくてはいけない」ですが、Numberクラスは継承して使用することが前提となっているクラス(=抽象クラス)であり、抽象メソッドを複数個もっているクラスになります。具体的にはintValue()メソッドやfloatValue()メソッドがそれに当たり、サブクラスとなるExNumberクラスではこれらのメソッドをオーバーライドするか、ExNumberクラス自身にabstract修飾子をつける必要があります。abstract修飾子をつけるとそのクラスはnewできなくなってしまい、7行目に何らかの修正を加える必要がでてきてしまうためコンパイルエラーの原因としては(6)の方が適当と考えられます。