자바 마지막 키워드의 깊이 이해

대한 기본적인 이해 :

  1. 수정 된 클래스

    클래스에 최종 수정 클래스는 상속 될 수 없음을 나타냅니다. 보안에서 JDK에서는,이 클래스는 상속 될 수 없습니다 등, 문자열 최종 클래스 시스템을 위해 설계되었습니다. 참고 : 클래스의 수정 된 최종 멤버가 변경 될 수 있습니다, 그것은하지 될 수 있습니다.

  2. 수정 방법 :

     방법은 서브 클래스에 의해 오버라이드 (override) 할 수 없습니다. 일반적으로 서브 클래스 및 수정 된 디자인에 의해 오버라이드 (override)하지 않으 클래스에 사용됩니다.

  3. 파라미터를 수정하는 방법 :

     수정 된 매개 변수는 생체 내에서 다시 할당 될 수 없다. 이것은 고려 하의 호출 측의 입장에 서있는 것 같다, 그것은 큰 오빠가 나에게 칼을 가져다가 사람을 참조하라고 갖고있는 것 같아요, 오빠는 당신이 그것을 잘라하기 위해 칼을 사용해야 말했다을 변경하지 Tulong는 기관총을 변경하지 않는, 또는 당신은 죽은 목숨이야. 총 장소를 모르는, 매개 변수 값의 마지막 수정이 이해하지 않았다는 것을 생각하지 않았다.

  4. 변형 멤버 변수.

      변형 부재 변수 번만 할당 될 수있다. 그것은 클래스 초기화하기 전에 할당됩니다.

깊은 이해와 사용

  일부 기능 수정 멤버 변수 (개인적으로이 더 사용 생각)의 주요 사용은 자바에서 사용할 수 있습니다.

  1. 수정 된 최종 멤버 변수의 사용은 상속 설계 클래스를 사용하여 클래스 할당에 초기화해야합니다.

    시나리오 : 필드 필드는 시간의 클래스 A의 설계에 필요가있다. 그러나이 클래스는 많은 하위 클래스를 가질 수 있고, 각각의 서브 클래스의 값은 동일하지 않습니다. 그런 다음 마지막으로 수정 된 fileld을 디자인 할 수 있습니다. 서브 클래스의 초기화 시간에 할당. 코드로서, 나는이 사람의 이름은 이름이 Person 클래스를 디자인해야하지만, 최종 수정 필드 이름, 생성자에서 할당 된 이름을 할 수 있도록 각 사람의 이름이 다르다는 것을 가정한다. 그래서 서브 클래스는 사람 이름 할당에 사람의 생성자를 호출해야 상속합니다. 우리는 인수가없는 생성자의 사용을 잃게 버그를해야합니까.

공공  클래스 는 Person {
     최종 문자열 이름;    // 할당 없음, 그것은 생성자에서 할당해야합니다. 
    공공 인격 (문자열 이름) {
         다음은이 .name을 = 이름; 
    } 
    공공  무효 worlk () { 

    } 
}
공공  클래스 학생 확장 사람 { 

    공공 학생 (문자열 이름) {
         슈퍼 (이름); // 必须调用父类的构造器
    } 
    
    
    @Override 
    공공 문자열 toString () {
         반환 "학생 [이름 ="+ 이름 + "]" ; 
    } 
    공공  정적  무효 메인 (문자열 []에 args) { 
        학생 S = 새로운 학생 ( "A" ); 
        학생 S1 = 새로운 학생 ( "B" ); 
        System.err.println을 (S); // 输出학생 [이름 = A]
        System.err.println을 (S1); // 출력 학생 [NAME = B] 
    } 
}

  은 "자바 멀티 스레드 프로그래밍 가이드"에서 2.final 키워드 특별한 의미 동시 프로그래밍 코드

    

공공  클래스 FinalFieldExample {
   최종  INT X;
  int로 Y를;
  정적 FinalFieldExample 인스턴스; 

  공개 FinalFieldExample () { 
    X = 1 ; 
    Y = 2 ; 
  } 

  공공  정적  무효 작가 () {  = 새로운 FinalFieldExample (); 
  } 

  공공  정적  무효 리더 () {
     최종 FinalFieldExample theInstance = 인스턴스;
    경우 (theInstance! = null이 ) {
       INTtheInstance.y = DIFF - theInstance.x;
       // 데프 1 (= 2-1) 할 수있다, 또한, 1 (= 0-1) 할 수있다. 
      인쇄 (은 diff); 
    } 
  } 

  개인  정적  무효 인쇄 ( INT X) {
     // ... 
  } 
}

  더 많은 동시 프로그래밍은 보안 위험은 물론, 경우에 이러한 코드 설계가되지 않습니다있을 것입니다. 이 책은 열자 참조하는 데 사용됩니다. 물체 (객체의 멤버) 사실이 아닌 원자 동작을 초기화 컴파일러. 위의 코드에서, 대한 의사 코드의 해당하는 FinalFieldExample 시간을 초기화합니다 :

 = OBJREF (. FinalFieldExample 할당 클래스 ); // 서브 작업 1 할당에 필요한 객체 저장 공간 
  ; objRef.x = 1 // : 오브젝트 초기화 서브 동작 2 
  objRef.y = 2 : // 서브 작업 3 : 개체 초기화 
  = OBJREF 인스턴스; // 서브 동작 4 : 기준 변수에 객체를 할당

 

 하지만 가끔은 컴파일러는 컴파일 코드를 최적화합니다. 오브젝트 초기화 후에 할당 변수 Y는 단계는, 상기 제 후에되기 전에, 제 3 단계가있을 수있다, 즉, 완성된다. 이것은이 순간의 네 번째 단계를 완료하기 위해 수행 될 수 있으며, 다른 스레드가이 오브젝트를 호출하고, Y의 디폴트의 초기 값의 값이 0이 아닌 (2)의 기대 값이다. 그러나 변수 X의 값은, 최종 수정 때문에, FinalFieldExample 초기화하기 전에 할당해야합니다 보장 할 수 정렬 한 후 4 단계, 그리고 다른 스레드를 볼 수 있도록하기 위해 그 2 단계를 보장하기 위해 최적화 할 수 없습니다.

  X = 1, 모든 상기 코드는, Y는 최종 수정 후, 호출 스레드가 원하는 값 y = 2를 얻는 것이 보장 될 수있다

 

3. 디자인 보안 제품 : 불변의 객체.

 

  업데이트하려면 ...

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

추천

출처www.cnblogs.com/jonrain0625/p/11324676.html