今回はアクセス修飾子に関する問題です。
問題
次のコードを実行した場合、どの行でコンパイルエラーが発生するでしょうか?正しい選択肢を選んでください。
public class Parent { private int privateValue = 1; int defaultValue = 2; protected int protectedValue = 3; public int publicValue = 4; } public class Child extends Parent { public void printValues() { System.out.println(privateValue); System.out.println(defaultValue); System.out.println(protectedValue); System.out.println(publicValue); } } public class Main { public static void main(String[] args) { Child child = new Child(); child.printValues(); } }
選択肢
- A. System.out.println(privateValue);
- B. System.out.println(defaultValue);
- C. System.out.println(protectedValue);
- D. System.out.println(publicValue);
- E. コンパイルエラーは発生しない
答えと解説
回答を見る
答え
A. System.out.println(privateValue);
解説
基本説明:
アクセス修飾子はクラスやメンバー(フィールド、メソッドなど)へのアクセスを制御します。Javaには、public、protected、default(パッケージプライベート)、privateの4種類のアクセス修飾子があります。
private修飾子を持つメンバーは、宣言されたクラスからのみアクセスできます。defaultは同一パッケージ内からのアクセスが可能、protectedはサブクラスおよび同じパッケージ内からアクセス可能です。publicはどこからでもアクセス可能です。
この問題では、private修飾子を持つ変数にサブクラスからアクセスしようとしているため、コンパイルエラーが発生します。
誤答理由
選択肢B~Dの変数はそれぞれ異なるアクセス修飾子を持っていますが、サブクラスや同一パッケージ内で利用可能なためコンパイルエラーにはなりません。
privateValue以外の変数へのアクセスは問題ありません。
つまずきポイント
アクセス修飾子を理解することはオブジェクト指向プログラミングの重要な基礎です。
特にサブクラスからアクセス可能かどうかの判断は初学者にとって難しい場合があります。
この問題では、サブクラスから親クラスのprivate修飾子を持つフィールドに直接アクセスできないことを理解することが重要です。
発展知識
アクセス修飾子を適切に使用することで、クラス間の依存を減らし、カプセル化を実現できます。
private修飾子を使って変数を隠蔽し、getterやsetterを使うことで、データの整合性を保つことができます。
Javaでは、内部クラスや匿名クラスといったクラス構造とアクセス修飾子の関係にも理解を深めると、より高度なコード設計が可能になります。