머리말
오늘 Android ContentProvider 구현을 보다가 Java 클래스에서 정적 도메인, 정적 블록, 비정적 도메인, 비정적 블록, 생성자의 실행 순서가 갑자기 생각났습니다. 새로운 프로세스. 사실 이것은 Java에 대한 기본 지식의 숙달을 테스트하는 매우 고전적인 질문입니다. 면접 과정에서 이런 질문이 많이 나올 것 같은데, 주말에 시간을 활용해서 검토해 보세요.
결론
여기서는 먼저 정리된 결론을 제시하고, 그 다음 결론을 검증하는 프로그램을 작성하겠습니다. Java 클래스가 새로운 경우 실행 순서는 다음과 같습니다.
자체 정적 속성과 정적 코드 블록을 구현합니다. (코드가 나타나는 순서에 따라 누가 먼저 실행하는지 결정)
자신만의 비정적 속성과 비정적 코드 블록을 구현하세요.
자체 생성자를 실행합니다.
상속받은 클래스를 새로 구현하는 과정에서 초기화 실행 순서는 다음과 같습니다.
상위 클래스의 공개 정적 속성과 정적 블록 수준 코드를 구현합니다.
자신만의 정적 속성과 정적 블록 수준 코드를 구현하세요.
상위 클래스의 비정적 속성과 비정적 코드 블록을 구현합니다.
상위 클래스의 생성자를 실행합니다.
자신만의 비정적 속성과 비정적 코드 블록을 구현하세요.
자체 생성자를 실행합니다.
여기서는 정적 코드 블록과 비정적 코드 블록을 간략하게 소개하겠습니다.
1. 정적 코드 블록:
정적 {
}
2. 비정적 코드 블록
{
}
정적 코드 블록과 비정적 코드 블록의 유사점과 차이점은 다음과 같습니다.
유사점: 둘 다 JVM이 클래스를 로드할 때와 생성자가 실행되기 전에 실행됩니다. 다중 정의가 가능합니다. 클래스에서 정의되며 일반적으로 일부 정적 변수에는 코드 블록에 값이 할당됩니다.
차이점: 정적 코드 블록은 비정적 코드 블록(정적 코드 블록 > 비정적 코드 블록)보다 먼저 실행됩니다. 정적 코드 블록은 처음으로 새로 작성될 때 한 번만 실행되고 그 이후에는 실행되지 않습니다. 비정적 코드 블록은 새로운 코드 블록이 될 때마다 실행됩니다.
검증
결론을 검증하는 가장 좋은 방법은 결과를 증명하는 코드를 작성하는 것입니다. 먼저 상속 없이 클래스를 초기화할 때의 실행 순서를 살펴보겠습니다. 코드는 다음과 같습니다.
public class InitOderTest { public static String STATIC_FIELD = "静态属性"; // 静态块 static { System.out.println(STATIC_FIELD); System.out.println("静态代码块"); } public String field = "非静态属性"; // 非静态块 { System.out.println(field); System.out.println("非静态代码块"); } public InitOderTest() { System.out.println("无参构造函数"); } public static void main(String[] args) { InitOderTest test = new InitOderTest(); } }
실행 결과:
정적 속성
정적 코드 블록
비정적 속성
비정적 코드 블록
인수 없는 생성자
다음으로 실행 순서가 올바른지 확인하겠습니다. Java 클래스가 우리의 결론과 일치하는 상속을 구현할 때. 테스트 코드는 다음과 같습니다.
class ParentTest { public static String PARENT_STATIC_FIELD = "父类-静态属性"; // 父类-静态块 static { System.out.println(PARENT_STATIC_FIELD); System.out.println("父类-静态代码块"); } public static String parentField = "父类-非静态属性"; // 父类-非静态块 { System.out.println(parentField); System.out.println("父类-非静态代码块"); } public ParentTest() { System.out.println("父类—无参构造函数"); } } public class InitOderTest extends ParentTest { public static String STATIC_FIELD = "静态属性"; // 静态块 static { System.out.println(STATIC_FIELD); System.out.println("静态代码块"); } public String field = "非静态属性"; // 非静态块 { System.out.println(field); System.out.println("非静态代码块"); } public InitOderTest() { System.out.println("无参构造函数"); } public static void main(String[] args) { InitOderTest test = new InitOderTest(); } }
실행 결과는 다음과 같습니다.
상위 클래스 정적 속성
상위 클래스 정적 코드 블록
정적 속성
정적 코드 블록
상위 클래스 - 비정적 속성
상위 클래스 - 비정적 코드 블록
상위 클래스 - 인수 없음 생성자
비정적 속성
비정적 코드 블록
인수 없는 생성자
Java에서 코드 블록의 실행 순서에 대한 더 많은 예를 보려면, 관련 기사는 PHP 중국어 웹사이트를 주목해주세요!