
問題
次のコードについて正しい説明はどれですか。
A.java
package p1;
public class A {
int a;
public A() {
this(0);
}
A(int a) {
this.a = a;
}
protected void methodA() {
System.out.println("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() {
return 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)Bクラスでは、a.aと記述するとAクラスのインスタンス変数aにアクセスできる
B)Aクラスのメソッド methodA のアクセス修飾子は public である必要がある
C)Bクラスのコンストラクタのアクセス修飾子は public である必要がある
D)Aクラスのすべてのコンストラクタのアクセス修飾子はpublic である必要がある
E)コードはコンパイルされ、A::methodA が出力される
解答
A)Bクラスでは、a.aと記述するとAクラスのインスタンス変数aにアクセスできる
B)Aクラスのメソッド methodA のアクセス修飾子は public である必要がある
C)Bクラスのコンストラクタのアクセス修飾子は public である必要がある
D)Aクラスのすべてのコンストラクタのアクセス修飾子はpublic である必要がある
E)コードはコンパイルされ、A::methodA が出力される
解説
次のコードについて正しい説明を考えてみましょう。
コードの確認
- A.java
A
クラスはパッケージp1
にあり、int a
を持つ。- デフォルトコンストラクタと
int
を引数に取るコンストラクタが定義されている。 methodA
はprotected
修飾子が付いている。
- B.java
B
クラスはパッケージp2
にあり、A
クラスのインスタンスa
を持つ。- プライベートなコンストラクタを持ち、インスタンスを初期化する。
- Main.java
B
クラスのインスタンスを取得し、callA
メソッドを呼び出す。
各選択肢の評価
A)Bクラスでは、a.aと記述するとAクラスのインスタンス変数aにアクセスできる。
- 誤り:
a
はprivate
であり、直接アクセスすることはできない。
B)Aクラスのメソッド methodA のアクセス修飾子は public である必要がある。
- 誤り:
methodA
はprotected
で定義されており、サブクラスや同じパッケージのクラスからアクセス可能です。
C)Bクラスのコンストラクタのアクセス修飾子は public である必要がある。
- 誤り:
B
クラスのコンストラクタはprivate
で問題ない。シングルトンパターンの実装です。
D)Aクラスのすべてのコンストラクタのアクセス修飾子は public である必要がある。
- 誤り: デフォルトコンストラクタはデフォルトアクセス修飾子で問題ありません。
E)コードはコンパイルされ、A::methodA が出力される。
- 正しい: コードはコンパイルされ、
B.getInstance()
を呼び出すことでA
のインスタンスが作成され、callA
メソッドによりmethodA
が呼び出されてA::methodA
が出力されます。
結論
正しい説明は E のみです。
対象資格:Java SE17 認定資格