final付きのクラス
class NormalClassA {}
final class FinalClassB {}
/* -- 継承できるか? -- */
// OK
class SubClassA extends NormalClassA {}
// ERROR: finalクラスは継承できない
class SubClasB extends FinalClassB {}
final付きのメソッド
class ClassA {
void normalMethod() {}
}
class ClassB {
final void finalMethod() {}
}
/* -- オーバーライドできるか? -- */
// OK
class SubClassA extends ClassA {
void normalMethod() {}
}
// ERROR: finalメソッドはサブクラスでオーバーライドできない
class SubClasB extends ClassB {
void finalMethod() {}
}
final付きの変数
class FinalVarSet {
// final変数は初期化が必要
final int finalVar1 = 1;
// 宣言時に初期化しなくても、
final int finalVar2;
// コンストラクタ内で初期化すればよい
FinalVarSet(int number) {
finalVar2 = number;
}
}
public class Main {
public static void main(String[] args) {
// これもfinal変数
final FinalVarSet finalObj1 = new FinalVarSet(100);
// ERROR: final変数(finalObj1)には再代入できない
finalObj1 = new FinalVarSet(200);
// ERROR: final変数(finalVar1)には再代入できない
finalObj1.finalVar1 = 2;
}
}