자바 의 static 와 final 의 각자 역할 과 연계

11524 단어 자바
final
        프로그램 컨 텍스트 환경 에 따라 자바 키워드 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
4
5

        정적 코드 블록 을 이용 하여 일부 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 alStaticFinalVar = new ArrayList(); 
        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();          }  }

좋은 웹페이지 즐겨찾기