アクセス制御を習得する:ソースコードで学ぶ SJC-P 5.0 ドリル(9)(2/2 ページ)
本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。
解答
D、E
解説
この問題はコンストラクタとアクセス修飾子をからめた問題です。まず、Subクラスの2行目ではコンストラクタを定義しています。サブクラスのコンストラクタは明示的に指定しないと、super()が呼び出されます。しかし、Superクラスでは、引数を持たないコンストラクタは定義されていないため、コンパイルエラーとなります。
2. public Sub(String x){ super(); // 明示的に定義しないと、super()が呼び出される 3. this.x = 10; 4. }
問題には、Superクラス内に引数を持たないコンストラクタを定義するといった選択肢がないため、明示的にSuperクラスの引数を持つコンストラクタを呼び出すことで、エラーを回避することができます。従って、Dが正解です。
2. public Sub(String x){ super(x); // Superクラスの引数を持つコンストラクタの呼び出し 3. this.x = 10; 4. }
また、Subクラスのコンストラクタ内の3行目では、x変数に10を代入しています。この際thisが使用されているため、Superクラスの2行目で定義したx変数にアクセスしますが、private指定されているため、コンパイルエラーとなります。
// Superクラス 2. private int x; : // Subクラス 2. public Sub(String x){ 3. this.x = 10; 4. }
選択肢のEにあるように、protectedに変更することで、サブクラスからも直接アクセスすることが可能になります。
// Superクラス 2. protected int x;
次のプログラムをコンパイルすると、コンパイルエラーとなります。 コンパイルを成功させるにはどの作業を行う必要がありますか? 2つ選択してください。 1. public class Super { 2. private int x; 3. private String y; 4. 5. public Super(String y) { 6. this.y = y; 7. this.x = 100; 8. } 9. 10. public String methodA() { 11. return "Hello"; 12. } 13. 14. public String methodB() { 15. return "x : " + x + " y : " + y ; 16. } 17. } Super.java ファイル 1. public class Sub extends Super { 2. public Sub(String x){ 3. this.x = 10; 4. } 5. } Sub.java ファイル A.Superコンストラクタ内にthis()の呼び出しを記述する B.Subコンストラクタ内にthis()の呼び出しを記述する C.Subコンストラクタ内にsuper()の呼び出しを記述する D.Subコンストラクタ内にsuper(x)の呼び出しを記述する E.Superクラスのx変数をprotectedに変更する F.Superクラスのy変数をprotectedに変更する
さらにもう一歩
次の2つのファイルがあります(サンプルコード2)。
package com.abc; class Foo { public String val = "Hello"; }
import com.abc.Foo; public class Sample2 { public static void main(String[] args) { Foo foo = new Foo(); System.out.println(foo.val); } }
サンプルコード2
Fooクラスをコンパイルした後、Sample2クラスをコンパイルすると、これはコンパイルエラーとなります。
Fooクラスはcom.abcパッケージに属しており、val変数はpublic指定されています。これにより、異なるパッケージに属するクラスからもアクセス可能となります。しかし、Fooクラス宣言自体がpublic指定されていないため、Sample2クラスからFooクラスにアクセスすることができず、コンパイルエラーとなります。Fooクラス宣言にpublic指定することでコンパイル、実行が可能となります。
public class Foo { public String val = "Hello"; }
このようにアクセス修飾子は、コンストラクタ、変数、メソッドだけではなく、クラスにも適用されます。ただし、前のページのアクセス修飾子の一覧表にも掲載しましたが、クラスに対しては、「public」もしくは「指定しない」の2種類のみとなります。
筆者紹介
山本道子
有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。
Copyright © ITmedia, Inc. All Rights Reserved.