問1
A C D
スーパークラスにサブクラスのオブジェクトを代入する操作だけが正しい。
問2
D E
instanceofでチェックするクラス型が、ObjectOutputStream か、そのスーパークラスであるときのみtrueになる。
B. 20
継承関係にあるクラス同士で、同じ名前のフィールド変数を定義することは問題ない。その場合、常に、自クラスで定義した変数が優先される。
Execクラスでは、Rect型オブジェクトをそのスーパークラスであるShape型の変数shapeに代入している。dispメソッドはRectクラスでオーバーライドされているので、shape.disp()で実行されるのはRectクラスのdispメソッドである。dispメソッドで出力するvalは、自クラス、つまり、Rectクラスのvalなので、20と表示される。
さらに詳しい解説は、20章の「フィールドの隠ぺい」(P.491)を参照すること。
以下は、平均値を計算して表示する汎用クラスComputeと、実際に、Computeクラスのオブジェクトを作って、runメソッドを実行するExecクラス。問題文にあるクラスと同じものを参考までに表示しておく。Computeクラスのrunメソッドの引数は、Mean型であるが、Execクラスでは、サブクラスのArithmeticMean型のオブジェクトを指定している。