자바 키워드 final,static 사용 총화

12198 단어 자바staticfinal
최종
        프로그램 컨 텍스트 환경 에 따라 자바 키워드 final 은'이것 은 바 꿀 수 없 는 것'이나'최종 적 인'의 미 를 가지 고 비 추상 적 인 유형,비 추상 적 인 구성원 방법 과 변 수 를 수식 할 수 있 습 니 다.디자인 이나 효율 이라는 두 가지 이해 때문에 변 화 를 막 아야 할 수도 있다.
        final 클래스 는 계승 할 수 없습니다.하위 클래스 가 없 으 면 final 클래스 의 방법 은 기본적으로 final 입 니 다.
        final 방법 은 하위 클래스 의 방법 으로 덮어 쓸 수 없 지만 계승 할 수 있 습 니 다.
        final 구성원 변 수 는 상수 입 니 다.한 번 만 할당 할 수 있 고 할당 후 값 은 변 하지 않 습 니 다.
        final 은 구조 방법 을 수식 하 는 데 사용 할 수 없다.
        메모:부모 클래스 의 private 구성원 방법 은 하위 클래스 에 덮어 쓸 수 없 기 때문에 private 형식의 방법 은 기본적으로 final 형식 입 니 다. 
1.final 클래스
        final 클래스 는 계승 할 수 없 기 때문에 final 클래스 의 구성원 방법 은 덮어 쓸 기회 가 없고 기본 값 은 final 입 니 다.디자인 클래스 에서 만약 에 이런 클래스 가 하위 클래스 가 필요 하지 않 으 면 클래스 의 실현 디 테 일 은 변 하지 않 고 이 클래스 가 확장 되 지 않 을 것 이 라 고 확신 하면 final 클래스 로 디자인 합 니 다.
2.final 방법
        하위 클래스 가 어떤 방법 을 덮어 쓰 는 것 을 허용 하지 않 는 다 면 이 방법 을 final 방법 으로 설명 할 수 있 습 니 다.
        final 방법 을 사용 하 는 이 유 는 두 가지 가 있 습 니 다.
        첫째,방법 을 잠 그 고 모든 계승 류 가 그 의 미 를 수정 하고 실현 하 는 것 을 방지한다.
        둘째,효율 적 이다.컴 파 일 러 는 final 방법 을 호출 할 때 내장 메커니즘 으로 전환 되 어 실행 효율 을 크게 높 인 다.
        예 를 들 면:

public class Test1 { 
public static void main(String[] args) { 
  // TODO          
} 
public void f1() { 
  System.out.println("f1"); 
} 
//           
public final void f2() { 
  System.out.println("f2"); 
} 
public void f3() { 
  System.out.println("f3"); 
} 
private void f4() { 
  System.out.println("f4"); 
} 
} 
public class Test2 extends Test1 { 
public void f1(){   
  System.out.println("Test1    f1   !"); 
} 
public static void main(String[] args) { 
  Test2 t=new Test2(); 
  t.f1();  
  t.f2(); //          final   
  t.f3(); //             
  //t.f4(); //    ,          
} 
}
3.final 변수(상수)
        final 로 장 식 된 구성원 변수 로 상수 를 표시 합 니 다.값 이 정 해 지면 바 꿀 수 없습니다!
        final 수식 변 수 는 세 가지 가 있 습 니 다.정적 변수,인 스 턴 스 변수 와 부분 변 수 는 각각 세 가지 유형의 상수 입 니 다.
        다음 의 예 에서 알 수 있 듯 이 final 변수 에 초기 값 을 주면 값 은 더 이상 바 꿀 수 없다.
        또한 final 변 수 를 정의 할 때 초기 값 을 주지 않 고 먼저 설명 할 수 있 습 니 다.이 변 수 는 final 공백 이 라 고도 부 릅 니 다.어떤 경우 에 도 컴 파일 러 는 공백 final 이 사용 하기 전에 초기 화 되 어야 합 니 다.그러나 final 공백 은 final 키워드 final 의 사용 에 있어 더욱 큰 유연성 을 제공 하기 때문에 한 가지 유형의 final 데이터 구성원 은 대상 에 따라 다 르 지만 변 함 없 는 특징 을 유지 할 수 있다. 

package org.leizhimin; 
public class Test3 { 
    private final String S = "final    S"; 
    private final int A = 100; 
    public final int B = 90; 
    public static final int C = 80; 
    private static final int D = 70; 
    public final int E; //final  ,               
    public Test3(int x) { 
        E = x; 
    } 
    /** 
     * @param args 
     */ 
    public static void main(String[] args) { 
        Test3 t = new Test3(2); 
        //t.A=101;  //  ,final              
        //t.B=91; //  ,final              
        //t.C=81; //  ,final              
        //t.D=71; //  ,final              
        System.out.println(t.A); 
        System.out.println(t.B); 
        System.out.println(t.C); //               
        System.out.println(t.D); //               
        System.out.println(Test3.C); 
        System.out.println(Test3.D); 
        //System.out.println(Test3.E); //  ,  E final  ,           . 
        System.out.println(t.E); 
        Test3 t1 = new Test3(3); 
        System.out.println(t1.E); //final    E           
    } 
    private void test() { 
        System.out.println(new Test3(1).A); 
        System.out.println(Test3.C); 
        System.out.println(Test3.D); 
    } 
    public void test2() { 
        final int a;   //final  ,          
        final int b = 4;  //    --final          
        final int c;  //final  ,       .  
        a = 3; 
        //a=4;    ,       . 
        //b=2;   ,       . 
    } 
}
4.final 매개 변수
        함수 매개 변수 가 final 형식 일 때 이 매개 변 수 를 읽 을 수 있 지만 이 매개 변수의 값 을 바 꿀 수 없습니다. 

public class Test4 { 
    public static void main(String[] args) { 
        new Test4().f1(2); 
    } 
    public void f1(final int i) { 
        //i++;  //i final   ,       . 
        System.out.print(i); 
    } 
}
정적
        static 는'전역'또는'정적'이라는 뜻 으로 구성원 변수 와 구성원 방법 을 수식 하 는 데 도 정적 static 코드 블록 을 형성 할 수 있 지만 자바 언어 에는 전역 변수의 개념 이 없다.
        static 에 의 해 수 식 된 구성원 변수 와 구성원 방법 은 이러한 종류의 모든 대상 에 독립 됩 니 다.즉,특정한 인 스 턴 스 에 의존 하지 않 고 모든 인 스 턴 스 에 의 해 공유 된다 는 것 이다.이 클래스 가 불 러 오기 만 하면 자바 가상 머 신 은 클래스 이름 이 실 행 될 때 데이터 구역 의 방법 구역 에 따라 그들 을 찾 을 수 있 습 니 다.따라서 static 대상 은 대상 이 생 성 되 기 전에 접근 할 수 있 으 며,대상 을 참조 하지 않 아 도 됩 니 다.
        Public 로 수 식 된 static 구성원 변수 와 구성원 방법 은 본질 적 으로 전역 변수 와 전역 방법 입 니 다.이러한 대상 시 를 설명 할 때 static 변수의 사본 을 생 성하 지 않 고 클래스 의 모든 인 스 턴 스 가 같은 static 변 수 를 공유 합 니 다.
       static 변수 앞 에 private 수식 이 있 을 수 있 습 니 다.이 변 수 는 클래스 의 정적 코드 블록 이나 클래스 의 다른 정적 구성원 방법 에서 사용 할 수 있 음 을 나타 냅 니 다(물론 비 정적 구성원 방법 에서 도 사용 할 수 있 습 니 다-쓸데없는 말).그러나 다른 클래스 에서 클래스 이름 을 통 해 직접 사용 할 수 없다 는 점 이 중요 합 니 다.실제로 private 는 방문 권한 이 한정 되 어 있 음 을 알 아야 합 니 다.static 는 예화 하지 않 으 면 사용 할 수 있다 고 말 합 니 다.그러면 훨씬 쉽게 이해 할 수 있 습 니 다.static 앞 에 다른 접근 권한 키 워드 를 추가 하 는 효과 도 이와 같다.  
       static 수식 의 구성원 변수 와 구성원 방법 은 습관 적 으로 정적 변수 와 정적 방법 이 라 고 부 릅 니 다.클래스 이름 을 통 해 직접 방문 할 수 있 습 니 다.방문 문법 은 다음 과 같 습 니 다.
클래스 이름.정적 방법 이름(매개 변수 목록...)
클래스 이름
        static 로 장 식 된 코드 블록 으로 정적 코드 블록 을 표시 합 니 다.자바 가상 머 신(JVM)이 클래스 를 불 러 올 때 이 코드 블록 을 실행 합 니 다. 
1.static 변수
        클래스 구성원 변 수 를 정적 으로 분류 하 는 지 여부 에 따라 두 가지 로 나 눌 수 있 습 니 다.하 나 는 static 에 의 해 수 정 된 변수 로 정적 변수 나 클래스 변수 라 고 합 니 다.다른 하 나 는 static 에 의 해 수식 되 지 않 은 변수 로 인 스 턴 스 변수 라 고 합 니 다.둘 의 차 이 는:
        정적 변 수 는 메모리 에 하나의 복사(메모리 절약)만 있 습 니 다.JVM 은 정적 으로 한 번 만 메모 리 를 할당 합 니 다.클래스 를 불 러 오 는 과정 에서 정적 변수의 메모리 분 배 를 완성 합 니 다.클래스 이름 으로 직접 접근 할 수 있 습 니 다(편리).물론 대상 을 통 해 접근 할 수 있 습 니 다(단,추천 하지 않 습 니 다).
        인 스 턴 스 변수 에 대해 인 스 턴 스 를 만 들 지 않 으 면 인 스 턴 스 변수 에 메모리 가 한 번 분 배 됩 니 다.인 스 턴 스 변 수 는 메모리 에 여러 개의 복사 가 있 고 서로 영향 을 주지 않 습 니 다(유연). 
2.정적 방법
        정적 방법 은 클래스 이름 을 통 해 직접 호출 할 수 있 고 모든 인 스 턴 스 도 호출 할 수 있 습 니 다.따라서 정적 방법 에 서 는 this 와 슈퍼 키 워드 를 사용 할 수 없습니다.소속 클래스 의 인 스 턴 스 변수 와 인 스 턴 스 방법(즉,static 이 없 는 구성원 변수 와 구성원 방법)에 직접 접근 할 수 없고 소속 클래스 의 정적 구성원 변수 와 구성원 방법 에 만 접근 할 수 있 습 니 다.인 스 턴 스 멤버 가 특정 대상 과 연결 되 어 있 기 때 문 입 니 다!이것 은 이해 해 야 합 니 다.그 이 치 를 알 고 싶 습 니 다.기억 이 아 닙 니 다!!
        static 방법 은 모든 인 스 턴 스 에 독립 되 어 있 기 때문에 static 방법 은 추상 적 인 abstract 가 아니 라 실현 되 어야 합 니 다. 
3.static 코드 블록
        static 코드 블록 은 정적 코드 블록 이 라 고도 부 릅 니 다.클래스 에서 클래스 구성원 에 독립 된 static 구문 블록 입 니 다.여러 개 있 을 수 있 고 위 치 는 마음대로 놓 을 수 있 습 니 다.그 어떠한 방법 에 도 없 으 며 JVM 로드 클래스 는 이러한 정적 코드 블록 을 실행 합 니 다.만약 에 static 코드 블록 이 여러 개 있 으 면 JVM 은 클래스 에 나타 난 선후 순서에 따라 순서대로 실 행 됩 니 다.코드 블록 마다 한 번 만 실 행 됩 니 다.예 를 들 면: 

public class Test5 { 
    private static int a; 
    private int b; 
    static { 
        Test5.a = 3; 
        System.out.println(a); 
        Test5 t = new Test5(); 
        t.f(); 
        t.b = 1000; 
        System.out.println(t.b); 
    } 
    static { 
        Test5.a = 4; 
        System.out.println(a); 
    } 
    public static void main(String[] args) { 
        // TODO          
    } 
    static { 
        Test5.a = 5; 
        System.out.println(a); 
    } 
    public void f() { 
        System.out.println("hhahhahah"); 
    } 
}
실행 결과:
3
hhahhahah
1000
        정적 코드 블록 을 이용 하여 일부 static 변 수 를 할당 할 수 있 습 니 다.마지막 으로 이 예 들 을 다시 한 번 보 세 요.모두 static 의 main 방법 입 니 다.그러면 JVM 은 main 방법 을 실행 할 때 인 스 턴 스 를 만 들 지 않 고 직접 호출 할 수 있 습 니 다. 
4.static 와 final 은 무엇 을 표시 합 니까?
        static final 은 구성원 변수 와 구성원 방법 을 수식 하 는 데 사용 되 며'전역 상수'로 간단하게 이해 할 수 있 습 니 다!
        변수 에 대해 서 는 값 을 주면 수정 할 수 없고 클래스 이름 을 통 해 접근 할 수 있 음 을 나타 낸다.
        방법 에 대해 서 는 덮어 쓸 수 없 음 을 표시 하 며,유사 이름 을 통 해 직접 방문 할 수 있 습 니 다.       
        특히 한 가지 문 제 를 주의해 야 한다.
        static 과 final 에 의 해 수 정 된 인 스 턴 스 상수 에 대해 인 스 턴 스 자 체 는 더 이상 바 꿀 수 없 지만 일부 용기 유형(예 를 들 어 Array List,HashMap)의 인 스 턴 스 변 수 는 용기 변수 자 체 를 바 꿀 수 없 지만 용기 에 저 장 된 대상 을 수정 할 수 있다 는 점 은 편집 과정 에서 많이 사용 된다.
        이렇게 많은 말 을 했 는 지 오히려 너 를 어 지 럽 혔 으 니 예 를 들 어 보 자. 

public class TestStaticFinal { 
    private static final String strStaticFinalVar = "aaa"; 
    private static String strStaticVar = null; 
    private final String strFinalVar = null; 
    private static final int intStaticFinalVar = 0; 
    private static final Integer integerStaticFinalVar = new Integer(8); 
    private static final ArrayList<String> alStaticFinalVar = new ArrayList<String>(); 
    private void test() { 
        System.out.println("-------------    ----------\r
"); System.out.println("strStaticFinalVar=" + strStaticFinalVar + "\r
"); System.out.println("strStaticVar=" + strStaticVar + "\r
"); System.out.println("strFinalVar=" + strFinalVar + "\r
"); System.out.println("intStaticFinalVar=" + intStaticFinalVar + "\r
"); System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "\r
"); System.out.println("alStaticFinalVar=" + alStaticFinalVar + "\r
"); //strStaticFinalVar=" "; // ,final , . strStaticVar = " "; // ,static , . //strFinalVar=" "; // , final , ( null), 。 //intStaticFinalVar=2; // , final , ( null), 。 //integerStaticFinalVar=new Integer(8); // , final , ( null), 。 alStaticFinalVar.add("aaa"); // , , 。 , 。 alStaticFinalVar.add("bbb"); // , , 。 , 。 System.out.println("------------- ----------\r
"); System.out.println("strStaticFinalVar=" + strStaticFinalVar + "\r
"); System.out.println("strStaticVar=" + strStaticVar + "\r
"); System.out.println("strFinalVar=" + strFinalVar + "\r
"); System.out.println("intStaticFinalVar=" + intStaticFinalVar + "\r
"); System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "\r
"); System.out.println("alStaticFinalVar=" + alStaticFinalVar + "\r
"); } public static void main(String args[]) { new TestStaticFinal().test(); } }
실행 결 과 는 다음 과 같 습 니 다.

-------------    ----------
strStaticFinalVar=aaa
strStaticVar=null
strFinalVar=null
intStaticFinalVar=0
integerStaticFinalVar=8
alStaticFinalVar=[]
-------------    ----------
strStaticFinalVar=aaa
strStaticVar=    
strFinalVar=null
intStaticFinalVar=0
integerStaticFinalVar=8
alStaticFinalVar=[aaa, bbb]
Process finished with exit code 0
        위의 예 를 보면 많이 알 수 있 지만 static final 을 통 해 수 정 된 용기 유형 변수 에서'장 착'대상 은 바 꿀 수 있다 는 것 을 알 아야 합 니 다.이것 은 일반적인 기본 유형 과 유형 변수 와 차이 가 매우 큰 부분 이다.
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 자바 키워드 final,static 사용 총화 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기