本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。
連載第9回の今回は、アクセス制御に関する出題です。
アクセス制御とは、クラス、コンストラクタ、変数、メソッドに対してほかのクラスからのアクセスを許可するか、しないかなどの制限を行うことです。その際、Java言語ではアクセス修飾子を使用します。アクセス修飾子の種類は以下のとおりです。
広い |
アクセス 修飾子 |
適用箇所 |
説明 |
|||
クラス |
コンスト ラクタ |
変数 |
メソッド |
|||
↑ |
public |
○ |
○ |
○ |
○ |
どのクラスからでも利用可能 |
公開範囲 |
protected |
× |
○ |
○ |
○ |
このクラスを継承したサブクラス、もしくは同一パッケージ内のクラスから利用可能 |
↓ |
デフォルト |
○ |
○ |
○ |
○ |
同一パッケージ内のクラスからのみ利用可能 |
狭い |
private |
× |
○ |
○ |
○ |
同一クラス内からのみ利用可能 |
表1 アクセス修飾子の種類と適用個所 |
ほかのクラスからアクセスができないようにするためには、そのメンバの宣言時にprivateを指定し、ほかのクラスから直接アクセスできるようにするためにはpublicを指定します。
protectedは、サブクラスのメンバもしくは、同一パッケージ内のクラスのメンバからアクセスすることは許可しますが、それ以外のクラスからはアクセスができません。また、アクセス修飾子を指定しなかった場合はデフォルトが適用されます。デフォルトは、同一パッケージ内のクラスからのみアクセス可能です。
1. class A { 2. private int a1; 3. protected int a2; 4. 5. public void setDataA(int x1, int x2) { 6. a1 = x1; 7. a2 = x2; 8. } 9. 10. public void displayA() { 11. System.out.println("--- displayA()メソッドからの出力"); 12. System.out.println("a1:" + a1 + " a2:" + a2); 13. } 14. } 15. 16. class B extends A { // クラスAのサブクラスとして定義 17. private int b1; 18. 19. public void setDataB(int y1) { 20. b1 = y1; 21. } 22. 23. public void displayB() { 24. System.out.println("--- displayB()メソッドからの出力"); 25. //System.out.print("a1:" + a1); 26. System.out.print("a2:" + a2); 27. System.out.println(" b1:" + b1); 28. } 29. } 30. 31. class Sample1 { 32. public static void main(String[] args) { 33. B obj = new B(); 34. obj.setDataA(10, 20); 35. obj.setDataB(100); 36. 37. //System.out.println("a1 = " + obj.a1); 38. System.out.println("a2 = " + obj.a2); 39. //System.out.println("b1 = " + obj.b1); 40. 41. obj.displayA(); 42. obj.displayB(); 43. } 44. }
C:\sample>java Sample1 a2 = 20 --- displayA()メソッドからの出力 a1:10 a2:20 --- displayB()メソッドからの出力 a2:20 b1:100 C:\sample>
サンプルコード1は、アクセス修飾子を使用したサンプルプログラムです。Aクラスの2行目と3行目では、private指定された変数a1とprotected指定された変数a2が宣言されています。この2つの変数は、10行目の自クラス内で定義したdisplayA()メソッドからは問題なくアクセス可能です。
12. System.out.println("a1:" + a1 + " a2:" + a2);
しかし、AクラスのサブクラスであるBクラス内で定義したメソッドからは、private指定されたa1変数にアクセスをすることはできないため、25行目のコメントを外すとコンパイルエラーとなります。
25. //System.out.print("a1:" + a1);
26行目では、protected指定された変数に直接アクセスしていますが、AクラスとBクラスは継承関係があるためアクセス可能です。
26. System.out.print("a2:" + a2);
また、ほかのクラスであるSample1クラスの37行目と39行目はコメントを外すとコンパイルエラーとなります。
// a1は、private指定なので他クラスからアクセス不可 37. //System.out.println("a1 = " + obj.a1); // a2は、Sample1クラスとAクラスに継承関係はないが、 // 同一パッケージに属するためアクセス可能 38. System.out.println("a2 = " + obj.a2); // b1は、private指定なので他クラスからアクセス不可 39. //System.out.println("b1 = " + obj.b1);
以下の問題を考えてみてください。解答と解説は次のページにあります。
問題
次のプログラムをコンパイルすると、コンパイルエラーとなります。コンパイルを成功させるにはどの作業を行う必要がありますか? 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. }
1. public class Sub extends Super { 2. public Sub(String x){ 3. this.x = 10; 4. } 5. }
A.Superコンストラクタ内にthis()の呼び出しを記述する
B.Subコンストラクタ内にthis()の呼び出しを記述する
C.Subコンストラクタ内にsuper()の呼び出しを記述する
D.Subコンストラクタ内にsuper(x)の呼び出しを記述する
E.Superクラスのx変数をprotectedに変更する
F.Superクラスのy変数をprotectedに変更する
Copyright © ITmedia, Inc. All Rights Reserved.