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

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

解答

 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";
}
Foo.java ファイル
import com.abc.Foo;
public class Sample2 {
  public static void main(String[] args) {
    Foo foo = new Foo();
    System.out.println(foo.val);
  }
}
Sample2.java ファイル
サンプルコード2

 Fooクラスをコンパイルした後、Sample2クラスをコンパイルすると、これはコンパイルエラーとなります。

 Fooクラスはcom.abcパッケージに属しており、val変数はpublic指定されています。これにより、異なるパッケージに属するクラスからもアクセス可能となります。しかし、Fooクラス宣言自体がpublic指定されていないため、Sample2クラスからFooクラスにアクセスすることができず、コンパイルエラーとなります。Fooクラス宣言にpublic指定することでコンパイル、実行が可能となります。

public class Foo {
  public String val = "Hello";
}
Fooクラス宣言にpublic指定

 このようにアクセス修飾子は、コンストラクタ、変数、メソッドだけではなく、クラスにも適用されます。ただし、前のページのアクセス修飾子の一覧表にも掲載しましたが、クラスに対しては、「public」もしくは「指定しない」の2種類のみとなります。

筆者紹介

山本道子

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



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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