자바에서 final 키워드를 사용할 때의 주의점
final 클래스는 계승될 수 없습니다. 동시에final로 클래스를 수식하면final 클래스의 모든 방법이 은밀하게 final 방법으로 지정됨을 의미합니다
final 방법
클래스를 계승하는 과정에서 부모 클래스의final 방법에 대해 하위 클래스는 수정하고 덮어쓸 수 없습니다.
private 방법은 모두final 방법으로 은밀하게 지정됩니다.
final 방법을 사용하는 두 가지 이유가 있습니다.
final 키워드는 변수를 수식하는 데 가장 자주 사용되는 용법입니다. 구성원 변수를 수식하려면 정의할 때나 구조 방법에서 초기화해야 하며 초기화된 후에 값을 부여할 수 없습니다.
기본 유형 및 클래스 객체에 대한 의미는 다음과 같습니다.
예제
class Glyph {
void draw() {
System.out.println("Glyph.draw()");
}
Glyph() {
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int redius = 1;
RoundGlyph(int r) {
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
System.out.println("RoundGlyph.draw(), radius = " + radius);
}
}
public class RolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}
출력 결과:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
위의 코드는 클래스 초기화 과정과 숨겨진 재난 문제를 보여 줍니다.main 함수에서 파라미터 5로 RoundGlyph를 호출하는 구조 함수로 RoundGlyph 대상을 만들고 RoundGlyph 구조 방법이 실행되기 전에 상위 Glyph의 구조 방법을 호출합니다.
그러나 부류 Glyph의 구조 방법에서draw방법을 호출했다. 다태성 때문에 이때 실제적으로 부류의draw방법을 호출했지만 부류의redius는 구조기를 통해 초기화되지 않았기 때문에 출력했다.
RoundGlyph.draw(), radius = 0
이것은 분명히 우리가 원하는 결과가 아니기 때문에 주의해야 한다.final의 메모리 할당 방식을 요약합니다.
1. 손질 변수:
일반적인 상황에서final 변수는 세 군데 값을 부여할 수 있다. 바로 값을 부여하거나, 구조 함수를 구성하거나, 블록을 초기화하는 것이다.
(1) 초기화:
자바의 문법에서 성명과 초기화는 연결되어 있기 때문에
즉, 변수를 초기화하지 않으면 기본값으로 초기화합니다.(예: int는 0)
final 변수에 대해 설명할 때 값을 부여하지 않으면 시스템은 기본적으로 공백 영역입니다. 구조 함수를 초기화합니다.
정적이면 블록을 초기화할 수 있습니다.
(2) 메모리:
상량(final 변수)과 비final 변수의 처리 방식은 다르다.
모든 유형은 상수를 사용할 때 자신의 상수 탱크에 복사됩니다.
상량도 클래스 변수 (static) 처럼 방법 구역에 저장되지만, 단지 그는 상량 탱크에 저장할 뿐이다.
(아마도, 클래스 변수는 모든 실례에 의해 공유되고, 상량 탱크는 모든 실례에만 있는 것입니다.)
2. 손질 방법:
방법 구역에 저장하고 함수 코드로 직접 교체할 수 있으며, 실행될 때까지 기다릴 필요가 없다.
3. 손질류:
메소드에 저장합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.