アクセスレベルの概要
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はdefault(パッケージプライベートとも呼ばれます)アクセスを使用します。これにより、同じパッケージ内からのみアクセスが可能になります。
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"という形式の文字列を返すgetInfo()というpublicメソッドを含めてください。Main.java: Student オブジェクトを作成し、クラスの外から直接アクセスできるフィールドを実証します。schoolフィールドを直接出力し、次にgetInfo()の結果を出力して、すべての学生情報を表示します。
studentId、name、grade、school の4つの入力(この順序)を受け取ります。
出力は2行にする必要があります。直接アクセスした学校名と、それに続く getInfo() メソッドからの完全な学生情報です。
自分で試してみよう
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 クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造