자바에서 final 키워드를 사용할 때의 주의점

2776 단어 Javafinal
final 클래스
final 클래스는 계승될 수 없습니다. 동시에final로 클래스를 수식하면final 클래스의 모든 방법이 은밀하게 final 방법으로 지정됨을 의미합니다
final 방법
클래스를 계승하는 과정에서 부모 클래스의final 방법에 대해 하위 클래스는 수정하고 덮어쓸 수 없습니다.
private 방법은 모두final 방법으로 은밀하게 지정됩니다.
final 방법을 사용하는 두 가지 이유가 있습니다.
  • 잠금 방법으로 이불류가 그 의미를 수정하는 것을 방지한다
  • 초기의 자바 구현 버전에서final 방법은 내장 호출로 실현되어 성능을 향상시킬 수 있다
  • final 변수
    final 키워드는 변수를 수식하는 데 가장 자주 사용되는 용법입니다. 구성원 변수를 수식하려면 정의할 때나 구조 방법에서 초기화해야 하며 초기화된 후에 값을 부여할 수 없습니다.
    기본 유형 및 클래스 객체에 대한 의미는 다음과 같습니다.
  • 기본 유형에 대해final 변수가 초기화되면 이후에 이 변수의 값을 바꿀 수 없습니다
  • 클래스 대상에 대해 초기화된 후에 이 변수가 다른 대상을 가리키게 할 수는 없지만 그가 가리키는 대상의 내용은 바꿀 수 있다
  • staticfinal역은 컴파일러 상수라고 하는데 일반적으로 모두 대문자로 되어 있다.
    예제
    
    class Glyph {
     void draw() {
      System.out.println("Glyph.draw()");
     }
     Glyph() {
      System.out.println("Glyph() before draw()");
      draw();
      System.out.println("Glyph() after draw()");
     }
    }
    class RoundGlyph extends Glyph {
     private int redius = 1;
     RoundGlyph(int r) {
      radius = r;
      System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
     }
     void draw() {
      System.out.println("RoundGlyph.draw(), radius = " + radius);
     }
    }
    public class RolyConstructors {
     public static void main(String[] args) {
      new RoundGlyph(5);
     }
    }
    
    출력 결과:
    
    Glyph() before draw()
    RoundGlyph.draw(), radius = 0
    Glyph() after draw()
    RoundGlyph.RoundGlyph(), radius = 5
    
    위의 코드는 클래스 초기화 과정과 숨겨진 재난 문제를 보여 줍니다.
    main 함수에서 파라미터 5로 RoundGlyph를 호출하는 구조 함수로 RoundGlyph 대상을 만들고 RoundGlyph 구조 방법이 실행되기 전에 상위 Glyph의 구조 방법을 호출합니다.
    그러나 부류 Glyph의 구조 방법에서draw방법을 호출했다. 다태성 때문에 이때 실제적으로 부류의draw방법을 호출했지만 부류의redius는 구조기를 통해 초기화되지 않았기 때문에 출력했다.
    
    RoundGlyph.draw(), radius = 0
    
    이것은 분명히 우리가 원하는 결과가 아니기 때문에 주의해야 한다.
  • 가능한 한 간단한 방법으로 클래스 구성원을 초기화합니다
  • 구조기 중에서final 방법만 호출하는 것이 가장 좋다
  • 두 번째 이유는final이 다태성을 적용하지 않기 때문에 현재 대상의 상응하는 방법을 호출하는 것이지 초기화 작업이 아직 진행되지 않은 하위 클래스의 커버 방법이 아니라는 것을 보장할 수 있다.
    final의 메모리 할당 방식을 요약합니다.
    1. 손질 변수:
    일반적인 상황에서final 변수는 세 군데 값을 부여할 수 있다. 바로 값을 부여하거나, 구조 함수를 구성하거나, 블록을 초기화하는 것이다.
    (1) 초기화:
    자바의 문법에서 성명과 초기화는 연결되어 있기 때문에
    즉, 변수를 초기화하지 않으면 기본값으로 초기화합니다.(예: int는 0)
    final 변수에 대해 설명할 때 값을 부여하지 않으면 시스템은 기본적으로 공백 영역입니다. 구조 함수를 초기화합니다.
    정적이면 블록을 초기화할 수 있습니다.
    (2) 메모리:
    상량(final 변수)과 비final 변수의 처리 방식은 다르다.
    모든 유형은 상수를 사용할 때 자신의 상수 탱크에 복사됩니다.
    상량도 클래스 변수 (static) 처럼 방법 구역에 저장되지만, 단지 그는 상량 탱크에 저장할 뿐이다.
    (아마도, 클래스 변수는 모든 실례에 의해 공유되고, 상량 탱크는 모든 실례에만 있는 것입니다.)
    2. 손질 방법:
    방법 구역에 저장하고 함수 코드로 직접 교체할 수 있으며, 실행될 때까지 기다릴 필요가 없다.
    3. 손질류:
    메소드에 저장합니다.

    좋은 웹페이지 즐겨찾기