이 기사에서는 편집자가 Java Final을 모든 사람에게 소개합니다. 도움이 필요한 친구들이 참고할 수 있습니다
JAVA 키워드 final은 데이터, 메소드 또는 클래스를 수정하는 데 사용되며 일반적으로 "변경할 수 없음"을 의미합니다. " , 데이터를 변경할 수 없고 메서드를 재정의할 수 없으며 클래스를 상속할 수 없습니다. 일반적으로 final을 사용하는 두 가지 이유는 디자인과 효율성입니다. JAVA 버전이 업데이트됨에 따라 일부 효율성 문제는 컴파일러와 JVM에서 처리될 수 있습니다. 따라서 효율성 문제를 해결하기 위해 final을 사용하는 것은 그다지 중요하지 않습니다.
최종 수정자는 기본 데이터 유형 또는 불변 클래스의 필드에서 주로 사용됩니다(클래스의 모든 메소드가 객체를 변경하지 않는 경우 이 클래스는 불변 클래스입니다. String은 불변 클래스입니다).
[최종 데이터]
Final 키워드를 사용하여 데이터를 수정하는 경우에는 두 가지 주요 상황이 있습니다.
1. 컴파일 시간 상수
2. 런타임 초기화 컴파일 타임 상수의
값은 최종 필드와 정적 필드를 나타냅니다(관례에 따라 컴파일 타임 상수는 모두 대문자로 이름이 지정되며 각 단어를 구분하기 위해 밑줄을 사용합니다). , 저장공간을 변경할 수 없는 부분만 차지하고 있습니다. 컴파일러는 이를 사용할 수 있는 모든 계산 수식에 컴파일 시간 상수를 대체할 수 있습니다. 즉, 계산 수식은 컴파일 시간에 실행될 수 있으므로 런타임 부담이 상대적으로 줄어듭니다. 컴파일 타임 상수에는 정의 시 할당된 값이 있어야 합니다(반드시 기본 유형일 필요는 없음).
기본 유형의 경우 final은 값을 변경할 수 없게 만들고 객체 참조의 경우 final은 참조를 변경할 수 없게 만듭니다. 즉, 다른 객체를 가리키도록 변경할 수 없습니다. 수정되었습니다(객체이기도 한 배열에 적용됨).
코드는 다음과 같습니다.
public class javaFinalData{ private static final String TESTD = "test"; public static final String TESTE = "test"; public static final String[] TESTF = {"1","2"}; //非基本类型 private static final String[] TESTG = new String[2]; public static void main(String args[]){ final int testA = 1; final String testB = "test"; final int[] testC = {1,1,2,}; System.out.println(testC[1]); testC[1] = 123; System.out.println(testC[1]); } }
[할당되지 않은 최종 필드]
JAVA에서는 할당되지 않은 최종 필드의 생성을 허용하지만 반드시 다음 필드에 있어야 합니다. 필드 정의 각 생성자(생성자 수만큼)에 최종 필드를 할당하고 사용하기 전에 초기화되었는지 확인하세요. 이런 식으로 final은 동일한 클래스에서 불변 특성을 유지하면서 다른 객체에 다른 값을 할당할 수 있어 더욱 유연하게 사용할 수 있습니다.
코드는 다음과 같습니다.
public class javaBlankFinal{ private final int blank; public javaBlankFinal(){ blank = 2011; } public javaBlankFinal(int temp){ blank = 2012; } public javaBlankFinal(String temp){ blank = 2014; } public static void main(String args[]){ new javaBlankFinal(); } }
[최종 방법]
최종 방법을 사용하는 이유는 두 가지입니다. 하나는 방지하기 위해 방법을 잠그는 것입니다. 덮어쓰지 않도록 하고 상속의 메서드 동작이 변경되지 않도록 합니다. 두 번째는 메서드 호출을 인라인 호출(인라인)로 변환하여 메서드 호출 비용을 줄이는 것입니다. 그러나 최신 버전에서는 JVM이 자체적으로 최적화할 수 있으므로 효율성 문제를 처리하기 위해 최종 방법을 사용할 필요가 없습니다.
최종 메소드에 대해 또 한 가지 주의할 점이 있습니다. 클래스의 모든 전용 메소드는 암시적으로 최종 메소드로 지정됩니다(최종 수정을 추가할 수도 있지만 의미가 없습니다). 프라이빗 메서드를 재정의하려고 하면 컴파일러는 오류를 보고하지 않지만 실제로는 메서드를 덮어쓰지 않고 새 메서드를 생성하기만 하면 됩니다. private 메소드는 외부 클래스에서 접근할 수 없기 때문에 당연히 재정의될 수 없습니다.
위의 문제를 방지하려면 @Override 주석을 사용하세요. 프로그램에 표시된 바와 같이:
코드는 다음과 같습니다:
class finalFunction{ private void finalFunctionA(){ System.out.println("finalFunctionA"); } private final void finalFunctionB(){ System.out.println("finalFunctionB"); } final void finalFunctionC(){ System.out.println("finalFunctionC"); } void functionD(){} } class overrideFinalFunction extends finalFunction{ //@Override 添加@Override注解可以识别是否是override public void finalFunctionA(){ System.out.println("override finalFunctionA"); } public final void finalFunctionB(){ System.out.println("override finalFunctionB"); } //final void finalFunctionC(){} //Cannot override the final method from finalFunction @Override void functionD(){} //真正的override方法 } public class javaFinalFunction extends finalFunction{ public static void main(String args[]){ finalFunction ff = new finalFunction(); //ff.finalFunctionA(); //无法调用private方法 //ff.finalFunctionB(); overrideFinalFunction off = new overrideFinalFunction(); off.finalFunctionA(); //public方法 off.finalFunctionB(); } }
[final class]
final class의 사용은 일반적으로 디자인을 위한 것입니다. 이유가 있으며 클래스는 상속되지 않습니다. 이렇게 하면 클래스의 동작이 변경되지 않고 일부 보안 위험도 방지할 수 있습니다. Final 클래스의 모든 메서드는 암시적으로 final 메서드로 지정되므로 재정의할 수 없습니다(final 클래스는 상속을 금지하므로 해당 클래스의 메서드를 재정의할 수 없습니다). Java Core API에는 java.lang.String 등 final을 적용한 예가 많이 있습니다. String 클래스에 final을 지정하면 length()와 같은 메서드가 재정의되는 것을 방지할 수 있습니다.
final 필드의 경우 클래스가 final로 선언되더라도 클래스에 포함된 필드가 자동으로 final 필드가 되지는 않습니다.
코드는 다음과 같습니다.
final class finalClass{ int testA = 2011; } //class extendFinalClassextends finalClass{} //can not extendthe final class finalClass public class javaFinalClass{ public static void main(String args[]){ finalClass fc = new finalClass(); System.out.println(fc.testA); fc.testA = 2012; System.out.println(fc.testA); } }
위 내용은 Java Final 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!