> Java > java지도 시간 > 본문

Java Final 살펴보기

巴扎黑
풀어 주다: 2017-05-21 14:10:46
원래의
1225명이 탐색했습니다.

이 기사에서는 편집자가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!