本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。
連載第8回の今回は、参照型の型変換に関する出題です。
前回の「基本データ型の型変換を習得する」では、基本データ型の型変換について紹介しましたが、参照型データであるオブジェクトも型変換が可能です。参照型の場合は、宣言している変数の型とデータであるオブジェクトに継承関係もしくは実装関係が必要です。
→ → 暗黙に型変換が行われる → →
|
||||||||||||
|
→ |
|
||||||||||
|
→ |
|
||||||||||
← ← キャストを使用する ← ←
|
||||||||||||
図1 参照型の型変換 |
サブクラスのオブジェクトは、スーパークラスの型で宣言された変数であれば暗黙の型変換が行われます。また、インターフェイスの型で宣言した変数は、実装クラスのオブジェクトであれば暗黙の型変換が行われます。インターフェイス自体がインスタンス化されているわけではない点に注意しましょう。
abstract class Foo { int x; int y; public abstract void print(); public void method(int x, int y){ this.x = x; this.y = y;} } class MyClass extends Foo { public void print() { System.out.println("x : " + x + " y : " + y); } } class Sample1 { public static void main(String[] args) { //スーパークラスの変数にサブクラスのオブジェクトを代入 Foo f = new MyClass(); f.method(10, 20); // スーパークラスのメソッド呼び出しOK f.print(); // サブクラスのメソッド呼び出しOK } }
C:\sample>java Sample1 x : 10 y : 20 C:\sample>
参照型のデータも必要に応じてキャストを使用して型変換を行います。ただし、参照型のキャストは、「あるクラスをインスタンス化」→「スーパークラスやインターフェイスの型に代入」→「元のクラス(型)に戻す」という場面で使用されます。もし、参照型データがキャストしようとしているクラスから作成されたオブジェクトでなければ実行時にClassCastExceptionというエラーが発生します。
【構文】
(変換したい型)対象のオブジェクト
class Super { } class Sub extends Super{ } class Test { : Super super = new Sub(); Sub sub = (Sub)super; : }
明示的にキャストする主な目的は、サブクラスや実装クラスで独自に定義したメソッドを呼び出すコードを書くとコンパイルエラーになるからです。
コンパイルでは、呼び出そうとしているメソッドが宣言されているクラスに定義されているかどうかをチェックしています。
また、実行時には、インスタンス化されているオブジェクトのメソッドが呼び出されます。
以下の問題を考えてみてください。解答と解説は次のページにあります。
問題
次のプログラムを実行した結果はどうなりますか? [ ]に当てはまるものを選択してください。同じ選択肢を複数回使用することは可能です。
1. class X { 2. String val = "A"; 3. public String method() { 4. return this.val; 5. } 6. public String foo() { 7. return "X"; 8. } 9. } 10. class Y extends X { 11. String val = "B"; 12. public String foo() { 13. return "Y"; 14. } 15. } 16. public class Test{ 17. public static void main(String[] args) { 18. X x1 = new X(); 19. X x2 = new Y(); 20. System.out.println(x1.foo() + " : " + x1.method()); 21. System.out.println(x2.foo() + " : " + x2.method()); 22. } 23. }
実行結果
[ (1) ] : [ (2) ]
[ (3) ] : [ (4) ]
A.A
B.B
C.X
D.Y
Copyright © ITmedia, Inc. All Rights Reserved.