- final 제어자는 필드, 지역변수, 메서드, 클래스 앞에 위치 가능
1. final 변수
- final 제어자는 변수를 선언할 때만 지정가능
- 한 번 대입된 값을 수정할 수 없음
-final 필드
class A1 {
//선언과 동시에 값을 대입할 때
int a =3;
final int b =5;
A1() {
}
}
class A2 {
//선언과 값의 대입을 분리했을 때
int a;
final int b;
A2() {
a=3;
b=5;
}
}
class A3 {
//final 필드값을 대입한 후에는 추가 값 대입 불가능
int a = 3;
final int b = 5;
A3() {
a=7;
//b=9; (불가능)
}
}
- final 필드의 초기화는 반드시 생성자에서 진행
- final 지역 변수
class B {
void bcd() {
int a =3;
final int b =5;
a = 7;
//b=9; (불가능)
}
}
- 클래스 B 내 bcd() 메서드에서 정의한 지역 변수 b는 final로 선언돼 있으므로 값 수정 불가
- 필드가 final로 선언됐을 때 메모리 상황
A a = new A()
class A {
int a;
final int b;
A() {
a = 3;
b = 5;
}
}
- 필드는 final 필드 여부에 관계없이 객체 속에 포함
- 객체가 만들어질 때 final로 선언된 필드값은 상수(final)영역에 1개 복사
-지역변수가 final로 선언됐을 때 메모리 상황
B b = new B()
class B {
void bcd() {
int a = 3;
final int b = 5;
}
}
- 메서드의 실행 과정에서 지역변수들은 스택 메모리에 저장
- final 지역변수는 상수 영역에 1개 복사
- 값의 복사는 값을 선언한 후 최초로 값이 초기화될 떄 딱 한번 일어남
2. fianl 메서드와 final 클래스
1) final 메서드
- 최종 메서드
- 메서드의 기능을 변경할 수 없는 메서드
- 자식 클래스에서 해당 메서드를 오버라이딩할 수 없음
class A {
void abc() {
}
final void bcd() {
}
}
class B extends A {
void abc() {
}
//void bcd() {} -> 불가능
}
2) final 클래스
- 최종 클래스
- 더 이상 자식클래스가 없음
- 상속 자체가 아예 불가능
- ex) String 클래스
final class A {
//...
}
//class B extends A{} ->불가능
'Java' 카테고리의 다른 글
12-1장 추상 클래스 (0) | 2023.06.02 |
---|---|
11-2장 abstract 제어자 (0) | 2023.06.02 |
6-1 장 클래스와 객체의 개념 (2) | 2023.04.24 |
5-2장 문자열을 저장하는 String (0) | 2023.04.23 |
5-1장 배열 (2) (0) | 2023.04.22 |