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;
    }
}