최종 수업
최종 클래스는 상속받을 수 없습니다. 동시에 클래스가 최종으로 수정되면 최종 클래스의 모든 메소드가 암시 적으로 최종 방법으로 지정됨을 의미합니다.
최종 방법
클래스 상속 과정에서 부모 클래스의 최종 메소드에 대해 서브 클래스를 수정하거나 덮어 쓸 수 없습니다.
개인 방법은 모두 최종 방법으로 암시 적으로 지정됩니다.
최종 방법을 사용해야하는 두 가지 이유가 있습니다.
최종 변수
최종 키워드는 변수를 수정하는 데 가장 일반적으로 사용되는 방법입니다. 멤버 변수가 수정되면 정의시 또는 생성자에서 초기화되어야하며 초기화 후에 할당 할 수 없습니다.
기본 유형 및 클래스 객체에 대한 다른 의미가 있습니다.
정적 최종 필드를 컴파일주기 상수라고하며 일반적으로 대문자가됩니다.
예
클래스 glyph {void draw () {System.out.println ( "glyph.draw ()"); } glyph () {system.out.println ( "glyph () wefore draw ()"); 그리다(); System.out.println ( "glyph () 이후 ()"); }} 클래스 Roundglyph는 Glyph {private int redius = 1; Roundglyph (int r) {radius = r; System.out.println ( "Roundglyph.roundglyph (), radius =" + radius); } void draw () {System.out.println ( "Roundglyph.raw (), radius =" + radius); }} public class rolyconstructors {public static void main (String [] args) {New Roundglyph (5); }} 출력 결과 :
gryph () draw () Roundglyph.draw (), radius = 0glyph () 후 () Roundglyph.roundglyph (), radius = 5
위의 코드는 클래스 초기화 프로세스와 숨겨진 치명적인 문제를 보여줍니다.
주요 함수는 Roundglyph 생성자를 매개 변수 5로 호출하여 Roundglyph 객체를 생성하고 Parent Class Glyph의 Roundglyph 생성자가 Roundglyph 생성자가 실행되기 전에 호출됩니다.
그러나, 드로우 방법은 부모 클래스 글리프의 생성자에서 호출됩니다. 다형성으로 인해 서브 클래스의 드로우 방법이 실제로 호출됩니다. 그러나 서브 클래스의 레드 우스는 현재 생성자를 통해 초기화되지 않았으므로 출력은 다음과 같습니다.
Roundglyph.draw (), 반경 = 0
이것은 분명히 우리가 원하는 결과가 아니므로 주목하는 것이 중요합니다.
두 번째 이유는 Final이 다형성을 적용하지 않기 때문에 초기화 작업에서 수행되지 않은 서브 클래스의 재정의 방법보다는 현재 객체의 해당 방법이 호출되도록 보장 할 수 있습니다.
최종의 메모리 할당 방법을 요약하십시오.
1. 변수 수정 :
일반적으로 최종 변수를 할당 할 수있는 세 곳이 있습니다 : 직접 할당, 생성자 또는 초기화 블록에.
(1) 초기화 :
선언 및 초기화는 Java 구문과 관련이 있으므로
즉, 초기화 변수를 표시하지 않으면 시스템이 기본값으로 자동 초기화됩니다. (int가 0이면)
최종 변수의 경우, 선언시 값을 할당하지 않으면 시스템은이 공백 필드로 기본적으로 생성자에서 초기화됩니다.
정적 인 경우 블록을 초기화 할 수 있습니다.
(2) 메모리 :
상수의 처리 방법 (최종 변수) 및 비 결절 변수는 다릅니다.
각 유형이 상수를 사용하면 사본을 자체 상수 풀에 복사합니다.
상수는 또한 클래스 변수 (정적)와 같은 방법 영역에 저장되지만 상수 풀에 저장됩니다.
(아마도 클래스 변수는 모든 인스턴스에서 공유되는 반면, 일정한 풀은 각 인스턴스마다 고유합니다.)
2. 수정 방법 :
메소드 영역에 저장되며 어떤 기능이 특정인지를 결정하기 위해 실행 될 때까지 기다리지 않고 함수 코드로 직접 교체 할 수 있습니다.
3. 수정 범주 :
방법 영역에 저장하십시오.