今日はJavaのカプセル化に関する問題に取り組みましょう。
問題
以下のプログラムを実行した場合、出力される結果はどれでしょうか。正しい選択肢を選んでください。
class Person {
private String name = "John";
public void printName() {
System.out.println(name);
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.name = "Alice";
person.printName();
}
}
選択肢
- A. John
- B. Alice
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
C. コンパイルエラー
解説
基本説明
Javaにおけるアクセス修飾子は、クラスやクラスのメンバー(フィールド、メソッド)のアクセス範囲を制御します。最も一般的な修飾子は `public`、`protected`、`private` であり、`private` 修飾子はクラス外からのアクセスを禁止します。
今回の問題では、`Person`クラスの `name` フィールドが `private` に指定されています。つまり、他のクラスから直接アクセスすることはできません。
したがって、`Main`クラスで `person.name = “Alice”;` として `name` フィールドにアクセスを試みると、コンパイルエラーが発生します。
誤答理由
`A. John` や `B. Alice` はどちらも間違いです。なぜなら、`name` フィールドへは `Main` クラスから直接アクセスできないため、どちらの名前も設定されません。
実行時エラーではなく、コンパイルエラーが原因です。
つまずきポイント
初心者がよく間違えるポイントは、アクセス修飾子の理解です。特に `private` などによるフィールドの隠蔽が何を意味するのか分かっていないと、このような問題でつまずきます。
また、`private` メンバーのアクセスに対してアクセサメソッドを作成する必要性を理解していることが重要です。
発展知識
Javaのプログラムでカプセル化を実現するには、フィールドを `private` にし、必要に応じて `public` なアクセサメソッド(getter/setter)を作成します。
この手法により、クラス外部からの不正なアクセスや不適切なデータ変更を防ぎ、クラスのメンテナンス性や可読性を高めることが可能となります。
修正例
class Person {
private String name = "John";
public void printName() {
System.out.println(name);
}
public void setName(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("Alice");
person.printName();
}
}