JAVA 키워드 final은 데이터, 메서드 또는 클래스를 수정하는 데 사용됩니다. 이는 일반적으로 "변경 불가능"을 의미합니다. 즉, 데이터를 변경할 수 없고 메서드를 재정의할 수 없으며 클래스를 상속할 수 없습니다. 일반적으로 final을 사용하는 두 가지 이유는 디자인과 효율성입니다. JAVA 버전이 업데이트됨에 따라 일부 효율성 문제는 컴파일러와 JVM에서 처리될 수 있습니다. 따라서 효율성 문제를 해결하기 위해 final을 사용하는 것은 그다지 중요하지 않습니다.
Final 수정자는 기본 데이터 유형 또는 불변 클래스의 필드에서 주로 사용됩니다(클래스의 모든 메소드가 해당 객체를 변경하지 않는 경우 이 클래스는 불변 클래스입니다. String은 불변 클래스입니다).
【최종 데이터】
Final 키워드를 사용하여 데이터를 수정하는 두 가지 주요 상황은 다음과 같습니다.
1. 컴파일 타임 상수
2. 런타임 시 초기화되는 값
컴파일 타임 상수의 경우 최종적이고 정적인 필드를 나타냅니다(관례에 따라 컴파일 타임 상수의 이름은 모두 대문자로 지정되고 각 단어는 밑줄로 구분됩니다). 변경할 수 없습니다. 컴파일러는 이를 사용할 수 있는 모든 계산 수식에 컴파일 시간 상수를 대체할 수 있습니다. 즉, 계산 수식은 컴파일 시간에 실행될 수 있으므로 런타임 부담이 상대적으로 줄어듭니다. 컴파일 타임 상수에는 정의 시 할당된 값이 있어야 합니다(반드시 기본 유형일 필요는 없음).
런타임에 초기화된 값의 경우 기본 유형의 경우 final은 값을 변경할 수 없게 만들고 객체 참조의 경우 final은 참조를 변경할 수 없도록 만듭니다. 즉, 다른 객체를 가리키도록 변경할 수 없습니다. arrays 에 적용 가능하며 배열도 객체입니다).
private static final String TESTD = "테스트";
공개 정적 최종 문자열 TESTE = "테스트";
public static final String[] TESTF = {"1","2"} //기본이 아닌 유형
private static final String[] TESTG = new String[2];
공개 정적 무효 메인(문자열 인수[]){
최종 int testA = 1;
최종 문자열 testB = "테스트";
final int[] testC = {1,1,2,};
System.out.println(testC[1]);
테스트C[1] = 123;
System.out.println(testC[1]);
}
}
JAVA에서는 할당되지 않은 최종 필드의 생성을 허용하지만 최종 필드는 사용하기 전에 초기화되도록 필드 정의 또는 각 생성자(생성자 수만큼)에 할당되어야 합니다. 이런 식으로 final은 동일한 클래스에서 불변 특성을 유지하면서 다른 객체에 다른 값을 할당할 수 있어 더욱 유연하게 사용할 수 있습니다.
공개 javaBlankFinal(){
공백 = 2011;
}
공개 javaBlankFinal(int 임시){
공백 = 2012;
}
공개 javaBlankFinal(문자열 임시){
공백 = 2014;
}
공개 정적 무효 메인(문자열 인수[]){
새로운 javaBlankFinal();
}
}
최종 메서드를 사용하는 데에는 두 가지 이유가 있습니다. 하나는 메서드를 덮어쓰지 않도록 메서드를 잠그고 상속 중에 메서드 동작이 변경되지 않도록 하는 것입니다. 다른 하나는 메서드 호출을 인라인 호출로 변환하여 메서드 비용을 줄이는 것입니다. 전화. 그러나 최신 버전에서는 JVM이 자체적으로 최적화할 수 있으므로 효율성 문제를 처리하기 위해 최종 방법을 사용할 필요가 없습니다.
최종 메서드와 관련하여 주목해야 할 또 다른 사항이 있습니다. 클래스의 모든 전용 메서드는 암시적으로 최종 메서드로 지정됩니다(최종 수정 사항을 추가할 수도 있지만 의미가 없습니다). 프라이빗 메서드를 재정의하려고 하면 컴파일러는 오류를 보고하지 않지만 실제로는 메서드를 덮어쓰지 않고 새 메서드를 생성하기만 하면 됩니다. private 메소드는 외부 클래스에서 접근할 수 없기 때문에 당연히 재정의될 수 없습니다.
@Override 주석을 사용하면 위의 문제를 방지할 수 있습니다. 프로그램에 표시된 대로:
개인 최종 무효 finalFunctionB(){
System.out.println("finalFunctionB");
}
최종 무효 finalFunctionC(){
System.out.println("finalFunctionC");
}
무효 함수D(){}
}
클래스 overrideFinalFunction은 finalFunction을 확장합니다.
//@Override @Override 주석을 추가하여 재정의인지 식별합니다.
공개 무효 finalFunctionA(){
System.out.println("finalFunctionA 재정의");
}
공개 최종 무효 finalFunctionB(){
System.out.println("finalFunctionB 재정의");
}
//final void finalFunctionC(){} //finalFunction의 최종 메서드를 재정의할 수 없습니다.
@보수
void functionD(){} //실제 재정의 메서드
}
공개 클래스 javaFinalFunction은 finalFunction을 확장합니다.
공개 정적 무효 메인(문자열 인수[]){
finalFunction ff = 새로운 finalFunction();
//ff.finalFunctionA(); //프라이빗 메소드를 호출할 수 없습니다.
//ff.finalFunctionB();
overrideFinalFunction off = 새로운 overrideFinalFunction();
off.finalFunctionA(); //공용 메소드
off.finalFunctionB();
}
}
최종 클래스를 사용하는 것은 일반적으로 클래스 상속을 허용하지 않는 설계상의 이유입니다. 이렇게 하면 클래스의 동작이 변경되지 않고 일부 보안 위험도 방지할 수 있습니다. Final 클래스의 모든 메서드는 암시적으로 final 메서드로 지정되므로 재정의할 수 없습니다(final 클래스는 상속을 금지하므로 해당 클래스의 메서드를 재정의할 수 없습니다). Java Core API에는 java.lang.String 등 final을 적용한 예가 많이 있습니다. length()와 같은 메서드 덮어쓰기를 방지하려면 String 클래스에 final을 지정합니다.
final 필드의 경우 클래스가 final로 선언되더라도 클래스의 필드는 자동으로 final 필드가 되지 않습니다.
공개 클래스 javaFinalClass{
공개 정적 무효 메인(문자열 인수[]){
finalClass fc = 새로운 finalClass();
System.out.println(fc.testA);
fc.testA = 2012;
System.out.println(fc.testA);
}
}