問題
次のコードについて正しい説明はどれですか。
A.java
package p1;
public class A {
int a;
public A() {
this(0);
}
A(int a) {
this.a = a;
}
protected void methodA() {
System.out.print("A:methodA");
}
}
B.java
package p2;
import p1.A;
public class B {
private static B b = new B();
private A a;
private B() {
a = new A();
}
public static B getInstance() {
retrun b;
}
public void callA() {
a.methodA();
}
}
Main.java
import p2.B;
public class Main {
public static void main(String... args) {
B b = B.getInstance();
b.callA();
}
}
選択肢
A)A クラスのメソッド methodAのアクセス修飾子は public である必要がある
B)コードはコンパイルされ、A : : methodAが出力される
C)Bクラスでは、a.aと記述するとAクラスのインスタンス変数a にアクセスできる
D)B クラスのコンストラクタのアクセス修飾子はpublic である必要がある
E)A クラスのすべてのコンストラクタのアクセス修飾子は public である必要がある
解答
A)A クラスのメソッド methodAのアクセス修飾子は public である必要がある
B)コードはコンパイルされ、A : : methodAが出力される
C)Bクラスでは、a.aと記述するとAクラスのインスタンス変数a にアクセスできる
D)B クラスのコンストラクタのアクセス修飾子はpublic である必要がある
E)A クラスのすべてのコンストラクタのアクセス修飾子は public である必要がある
解説
AクラスとBクラスは継承関係になく、また別のパッケージに所属しています。
MainクラスでB型のインスタンス化を行い、その後b.callA();により、呼び出しています。
BクラスのcallA()メソッドでは、a.methodA()を呼び出していますが、AクラスのmethodA()のアクセス修飾子はprotectedのため、アクセスできず、コンパイルエラーが発生します。
このコンパイルエラーを解消するには、methodA()のアクセス修飾子をprotectedからpublicに変更する必要があります。
A)A クラスのメソッド methodA のアクセス修飾子は public である必要がある
A
クラスのmethodA()
はprotected
です。しかし、B
クラスはp2
パッケージにあり、A
クラスはp1
パッケージにあるため、異なるパッケージ間でprotected
メソッドにはアクセスできません。これを解決するには、methodA()
のアクセス修飾子をpublic
に変更する必要があります。- 正しい選択肢です。
B)コードはコンパイルされ、A : : methodA が出力される
- これは誤りです。先述の通り、
protected
メソッドmethodA()
はp2
パッケージのクラスB
からはアクセスできません。そのため、このコードはコンパイルエラーになります。
C)B クラスでは、a.a と記述すると A クラスのインスタンス変数 a にアクセスできる
A
クラスのインスタンス変数a
はデフォルト(パッケージプライベート)アクセス修飾子が付いています。異なるパッケージのクラスから直接アクセスすることはできません。したがって、B
クラスでa.a
と書くとコンパイルエラーになります。- 誤りです。
D)B クラスのコンストラクタのアクセス修飾子は public である必要がある
B
クラスのコンストラクタはprivate
であり、これはシングルトンパターンを実装しているためです。コンストラクタがprivate
であっても問題はありません。クラス外からnew B()
としてインスタンス化することはできませんが、getInstance()
メソッドがB
のインスタンスを返すので、問題なく利用できます。- 誤りです。
E)A クラスのすべてのコンストラクタのアクセス修飾子は public である必要がある
A
クラスのコンストラクタの1つはデフォルト(パッケージプライベート)であり、もう1つはpublic
です。異なるパッケージでインスタンスを作成するために、public
コンストラクタさえあれば問題ありません。- 誤りです。
結論
正しい選択肢は A)A クラスのメソッド methodA のアクセス修飾子は public である必要がある です。
対象資格:Java SE17 認定資格