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

» 2008年04月22日 00時00分 公開
[山本道子有限会社 Ray]
前のページへ 1|2       

解答

 (1)X、(2)A、(3)Y、(4)A

解説

 18行目では、Xクラスをインスタンス化し、X型で宣言した変数で参照しています。

18.     X x1 = new X();

 20行目では、Xクラスで定義されたメソッドを呼び出しているため、foo()メソッドの戻り値は「X」、method()メソッドの戻り値は「A」が返ります。

20.     System.out.println(x1.foo() + " : " + x1.method());

 19行目では、Yクラスをインスタンス化していますが、変数はX型で宣言しています。YクラスはXクラスのサブクラスとして定義しているためコード上問題ありません。

 19.     X x2 = new Y();

 21行目では、foo()メソッドを呼び出していますが、Yクラスではfoo()メソッドをオーバーライドしているため、Yで定義されたfoo()メソッドが実行されます。従って戻り値は「Y」が返ります。

21.     System.out.println(x2.foo() + " : " + x2.method());

 また、method()メソッドの呼び出しを行っていますが、Yクラスでは定義していないため、Xクラスのmethod()メソッドが実行されます。method()メソッドでは、自オブジェクトが保持するval変数をリターンしています。val変数は、XクラスおよびYクラスのおのおので定義していますが、val変数をリターンするメソッドがXクラス側に定義されているため、「A」の値が返ります。

 1. class X {
 2.   String val = "A";
 3.   public String method() {
 4.     return this.val;
 5.   }
         :
10. class Y extends X {
11.   String val = "B";
【問題】
 次のプログラムを実行した結果はどうなりますか? 
[ ]に当てはまるものを選択してください。
同じ選択肢を複数回使用することは可能です。
 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

さらにもう一歩

●instanceof 演算子

 あるオブジェクトがどのクラスから作成されているかを調べるための演算子としてinstanceofが提供されています。参照変数名とクラス名を比較し、結果をboolean値で返します。

【構文】
参照変数名 instanceof クラス名

class Foo{}
   :
Foo f = new Foo();
if (f instanceof Foo) { } // true を返す

 instanceof は比較対象のオブジェクトが持つクラス名(スーパークラスを含む)であればtrueを返します。

class Foo { }
class MyClass extends Foo { }
class Sample2 {
  public static void main(String[] args) {
    Foo f = new MyClass();
    if ( f instanceof MyClass ) 
      System.out.println("MyClass true");
    if ( f instanceof Foo ) 
      System.out.println("Foo     true");
  }
}
サンプルコード2 
C:\sample>java Sample2
MyClass true
Foo     true
C:\sample>
サンプルコード2の実行結果

 前回の「基本データ型の型変換を習得する」から、2回にわたり型変換をお伝えしてきました。次回はアクセス制御の問題を出題します。

筆者紹介

山本道子

有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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