추상 (abstract)이 상속을 강제하는 것이라고 하면 final
은 상속/변경을 금지하는 규제이다.
이전에 PI 값을 지정할 때 다른 클래스에서 값을 수정할 수 있었는데, 이를 규제하기 위해 final
이라는 키워드를 쓸 수 있다. final로 지정을 하면 다른 메소드나 다른 클래스에서 변수의 값을 바꿀 수 없다.
class Calculator {
static final double PI = 3.14;
int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
//Calculator.PI = 6;
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
public class CalculatorDemo1 {
public static void main(String[] args) {
Calculator c1 = new Calculator();
System.out.println(c1.PI);
//Calculator.PI = 10;
}
}
final 메소드는 final 변수 만큼 사용 빈도가 높지는 않다. 아래의 코드는 final 메소드 b를 상속하려고 하기 때문에 오류가 발생한다.
class A {
final void b () {}
}
class B extends A {
void b () {}
}
//error
Cannot override the final method from A
final 클래스를 상속하려고 하고 있으며 이는 오류가 발생한다.
final class C{
final void b(){}
}
class D extends C{}