アクセスレベルの概要
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 10/87。
アクセス修飾子は、フィールドやメソッドがどこからアクセスできるかを制御します。Javaには4つのレベルのアクセス制御があります。
| 修飾子 | 同一クラス | 同一パッケージ | サブクラス | すべての場所 |
|---|---|---|---|---|
private | はい | いいえ | いいえ | いいえ |
| デフォルト (キーワードなし) | はい | はい | いいえ | いいえ |
protected | はい | はい | はい | いいえ |
public | はい | はい | はい | はい |
public class BankAccount {
private double balance; // このクラス内のみ
String accountType; // デフォルト:同一パッケージ内のみ
protected String owner; // 同一パッケージ内 + サブクラス
public String bankName; // どこからでもアクセス可能
}private は最も制限が厳しく、直接アクセスすべきではない内部データに使用します。public は最も制限が緩く、他のクラスから呼び出す必要があるメソッドに使用します。
修飾子を指定しない場合、Javaはデフォルト(パッケージプライベートとも呼ばれる)アクセスを使用します。これにより、同じパッケージ内からのみアクセスが可能になります。
class Helper { // デフォルトアクセスのクラス
void assist() { } // デフォルトアクセスのメソッド
}コードが正常に動作する範囲内で、最も制限の厳しいアクセスレベルを選択してください。これにより、データが保護され、コードのメンテナンスが容易になります。
チャレンジ
簡単アクセス修飾子が異なるファイル間での可視性をどのように制御するかを実証する、Student 記録システムを構築しましょう。
コードを整理するために、2つのファイルを作成します:
Student.java: 異なるアクセスレベルのフィールドを持つ Student クラスを定義します:privateフィールド:studentId(String) - Student クラス内からのみアクセス可能- デフォルト(修飾子なし)フィールド:
grade(int) - 同じパッケージ内からアクセス可能 protectedフィールド:name(String) - 同じパッケージ内およびサブクラスからアクセス可能publicフィールド:school(String) - どこからでもアクセス可能
"[studentId] name - Grade grade at school"という形式の文字列を返すpublicメソッドgetInfo()を含めてください。Main.java: Student オブジェクトを作成し、クラスの外部からどのフィールドに直接アクセスできるかを実証します。schoolフィールドを直接出力し、次にgetInfo()の結果を出力して、すべての生徒情報を表示します。
studentId、name、grade、school の4つの入力(この順序)を受け取ります。
出力は2行にする必要があります:直接アクセスした学校名と、それに続く getInfo() メソッドからの完全な生徒情報です。
チートシート
アクセス修飾子は、フィールドやメソッドにどこからアクセスできるかを制御します。Javaには4つのレベルのアクセス制御があります。
| 修飾子 | 同一クラス内 | 同一パッケージ内 | サブクラス | どこからでも |
|---|---|---|---|---|
private | Yes | No | No | No |
| default (キーワードなし) | Yes | Yes | No | No |
protected | Yes | Yes | Yes | No |
public | Yes | Yes | Yes | Yes |
public class BankAccount {
private double balance; // このクラス内のみ
String accountType; // デフォルト:同一パッケージ内のみ
protected String owner; // 同一パッケージ内 + サブクラス
public String bankName; // どこからでもアクセス可能
}private は最も制限が厳しく、直接アクセスすべきではない内部データに使用します。public は最も開放的で、他のクラスが呼び出す必要があるメソッドに使用します。
修飾子を指定しない場合、Javaはデフォルト(パッケージプライベートとも呼ばれます)アクセスを使用します。これにより、同一パッケージ内からのみアクセスが許可されます。
class Helper { // デフォルトアクセスのクラス
void assist() { } // デフォルトアクセスのメソッド
}コードが正常に動作する範囲内で、最も制限の厳しいアクセスレベルを選択してください。これによりデータが保護され、コードのメンテナンスが容易になります。
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int grade = Integer.parseInt(scanner.nextLine());
String school = scanner.nextLine();
// TODO: 入力値を使用して Student オブジェクトを作成する
// TODO: school フィールドを直接出力する(public なのでアクセス可能)
// TODO: getInfo() の結果を出力して、すべての学生情報を表示する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造