連載
» 2008年04月22日 00時00分 UPDATE

ソースコードで学ぶ SJC-P 5.0 ドリル(8):参照型の型変換を習得する (1/2)

本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。

[山本道子,有限会社 Ray]

 連載第8回の今回は、参照型の型変換に関する出題です。

参照型の暗黙変換

 前回の「基本データ型の型変換を習得する」では、基本データ型の型変換について紹介しましたが、参照型データであるオブジェクトも型変換が可能です。参照型の場合は、宣言している変数の型とデータであるオブジェクトに継承関係もしくは実装関係が必要です。

→ → 暗黙に型変換が行われる  → →
サブクラス
スーパークラス
実装クラス
インターフェイス
← ← キャストを使用する ← ←
図1 参照型の型変換

 サブクラスのオブジェクトは、スーパークラスの型で宣言された変数であれば暗黙の型変換が行われます。また、インターフェイスの型で宣言した変数は、実装クラスのオブジェクトであれば暗黙の型変換が行われます。インターフェイス自体がインスタンス化されているわけではない点に注意しましょう。

図2 暗黙変換が行われた例 図2 暗黙変換が行われた例
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
  }
}
サンプルコード1
C:\sample>java Sample1
x : 10 y : 20
C:\sample>
サンプルコード1の実行結果

参照型のキャスト演算子を使用した型変換

 参照型のデータも必要に応じてキャストを使用して型変換を行います。ただし、参照型のキャストは、「あるクラスをインスタンス化」→「スーパークラスやインターフェイスの型に代入」→「元のクラス(型)に戻す」という場面で使用されます。もし、参照型データがキャストしようとしているクラスから作成されたオブジェクトでなければ実行時にClassCastExceptionというエラーが発生します。

【構文】
(変換したい型)対象のオブジェクト

class Super { }
class Sub extends Super{ }
class Test {
    :
  Super super = new Sub();
  Sub sub = (Sub)super;
    :
}
図3 キャストを使用した例 図3 キャストを使用した例

 明示的にキャストする主な目的は、サブクラスや実装クラスで独自に定義したメソッドを呼び出すコードを書くとコンパイルエラーになるからです。

 コンパイルでは、呼び出そうとしているメソッドが宣言されているクラスに定義されているかどうかをチェックしています。

 また、実行時には、インスタンス化されているオブジェクトのメソッドが呼び出されます。

図4 SuperクラスとSubクラスを利用するクラス 図4 SuperクラスとSubクラスを利用するクラス

演習問題

 以下の問題を考えてみてください。解答と解説は次のページにあります。

問題

 次のプログラムを実行した結果はどうなりますか? [ ]に当てはまるものを選択してください。同じ選択肢を複数回使用することは可能です。

 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

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。