finalキーワード
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 13/87。
Javaにおけるfinalキーワードは、変更を防止します。これは変数、メソッド、およびクラスに適用でき、それぞれ異なる効果があります。
変数に final を適用すると、それは定数になります。一度代入されると、その値を変更することはできません。
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // コンストラクタで一度だけ代入可能
}
public void setRadius(double r) {
// this.radius = r; // エラー!final変数は再代入できません
}
}final 変数は、宣言時またはコンストラクタ内のいずれかで初期化されなければなりません。その後、それを再代入しようとするとコンパイルエラーが発生します。
参照型の場合、finalは参照が別のオブジェクトを指すことはできないことを意味しますが、オブジェクトの内容は依然として変更可能です。
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // エラー!再代入はできません
name.append(" Doe"); // OK!オブジェクトの内容は変更可能ですフィールドに final を使用することで、意図を明確に伝えることができます。これは、初期化後にこの値が変更されるべきではないことを他の開発者に伝えます。これは、設定値、ID、またはオブジェクトの生存期間を通じて一定である必要があるデータに対して特に有用です。
チャレンジ
簡単学生が登録された後に決して変更されるべきではないデータを保護するために、finalキーワードを使用するStudent登録システムを構築しましょう。
コードを整理するために2つのファイルを作成します:
Student.java: 一度設定されると特定の情報が恒久的にロックされるStudentクラスを作成します:finalフィールドstudentId(String) - 作成時に割り当てられ、決して変更できませんfinalフィールドenrollmentYear(int) - 学生が入学した年で、これも恒久的なものです- 通常のprivateフィールド
name(String) - 学生が名前を変更した場合に更新可能です - 3つの値すべてを受け取り、フィールドを初期化するコンストラクタ
- 学生IDのためのゲッター
getStudentId() - 入学年のためのゲッター
getEnrollmentYear() - 名前のためのゲッター
getName()とセッターsetName() - 次の形式を返すメソッド
getInfo():"ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
Main.java: Studentオブジェクトを作成し、名前を更新して情報を表示します。4つの入力(学生ID、初期の名前、入学年、および更新後の新しい名前)を受け取ります。次の2行を出力してください:- 名前変更前の学生情報
- 名前変更後の学生情報
studentId (String)、name (String)、enrollmentYear (int)、newName (String) の順に4つの入力を受け取ります。
finalフィールドが学生のIDと入学年をどのように保護しているかに注目してください。これらは変更されるべきではない恒久的な記録ですが、名前はセッターを通じて更新することができます。
自分で試してみよう
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 enrollmentYear = scanner.nextInt();
scanner.nextLine(); // 改行文字を消費する
String newName = scanner.nextLine();
// TODO: 初期値を使用して Student オブジェクトを作成する
// TODO: 名前変更前の学生情報を表示する
// TODO: セッターを使用して学生の名前を更新する
// TODO: 名前変更後の学生情報を表示する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造