アクセス制御を習得するソースコードで学ぶ SJC-P 5.0 ドリル(9)(1/2 ページ)

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

» 2008年05月20日 00時00分 公開
[山本道子有限会社 Ray]

 連載第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. }
サンプルコード1
C:\sample>java Sample1
a2 = 20
--- displayA()メソッドからの出力
a1:10 a2:20
--- displayB()メソッドからの出力
a2:20 b1:100
C:\sample>
サンプルコード1の実行結果

 サンプルコード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. }
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に変更する

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

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

メールマガジン登録

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