
問題
次のコードについて正しい説明はどれですか。
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 認定資格
