参照型の型変換を習得する:ソースコードで学ぶ SJC-P 5.0 ドリル(8)(2/2 ページ)
本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。
解答
(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");
}
}
C:\sample>java Sample2 MyClass true Foo true C:\sample>
前回の「基本データ型の型変換を習得する」から、2回にわたり型変換をお伝えしてきました。次回はアクセス制御の問題を出題します。
筆者紹介
山本道子
有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。
Copyright © ITmedia, Inc. All Rights Reserved.