예를 들어 Java에서 코드 블록의 실행 순서를 설명합니다.

3588 단어 Java실행 순서
앞말
오늘 Android ContentProvider가 실현되는 것을 볼 때 자바 클래스가 new 과정에서 정적 블록, 정적 블록, 비정적 블록, 구조 함수의 실행 순서 문제가 갑자기 생각났다.사실 이것은 매우 고전적인 문제로 자바의 기초 지식에 대한 파악 정도를 매우 고찰한다.많은 면접 과정에서 이런 문제도 있다고 믿고 주말에 시간이 있을 때 복습을 한다.
결론
여기에서 먼저 정리된 결론을 모두에게 던진 다음에 나는 절차를 써서 우리의 결론을 검증할 것이다.Java 클래스가 new가 되는 동안 다음과 같은 순서가 수행됩니다.
  • 자신의 정적 속성과 정적 코드 블록을 실현한다.(코드가 나타나는 순서에 따라 누가 먼저 실행할지 결정)
  • 자신의 비정적 속성과 비정적 코드 블록을 실현..
  • 자신의 구조 함수를 실행..
  • 계승된 클래스를 new로 만드는 과정에서 초기화 실행 순서는 다음과 같다.
  • 부류의 공공 정적 속성과 정적 블록급 코드를 실현..
  • 자신의 정적 속성과 정적 블록급 코드를 실현..
  • 부류의 비정적 속성과 비정적 코드 블록을 실현..
  • 부류의 구조 함수를 실행..
  • 자신의 비정적 속성과 비정적 코드 블록을 실현..
  • 자신의 구조 함수를 실행..
  • 여기에는 정적 코드 블록과 비정적 코드 블록을 간단하게 소개해야 한다.
    1. 정적 코드 블록:
        static { 
        } 
    2. 비정적 코드 블록
        { 
        } 
    정적 코드 블록과 비정적 코드 블록의 공통점은 다음과 같습니다.
  • 공통점: 모두 JVM이 클래스를 불러올 때 구조 함수가 실행되기 전에 실행되며, 클래스에서 여러 개를 정의할 수 있으며, 일반적으로 코드 블록에서 일부static 변수에 값을 부여한다..
  • 차이점: 정적 코드 블록은 비정적 코드 블록 이전에 실행됩니다(정적 코드 블록 > 비정적 코드 블록).정적 코드 블록은 첫 번째 new 때만 실행되고 이후에는 실행되지 않습니다.정적 코드 블록이 아니라 new마다 한 번씩 실행합니다.
  • 검증
    결론에 대한 가장 좋은 검증은 코드를 써서 결과를 증명하는 것이다.먼저 상속되지 않은 클래스를 초기화할 때의 실행 순서를 살펴보겠습니다. 코드는 다음과 같습니다.
     
    
      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(); 
        } 
      } 
    
    실행 결과:
  • 정적 속성
  • 정적 코드 블록
  • 비정적 속성
  • 비정적 코드 블록
  • 무참구조 함수
  • 다음은 자바 클래스가 계승된 후에 실행 순서가 우리의 결론과 일치하는지 검증해 봅시다.테스트 코드는 다음과 같습니다.
       
    
     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(); 
        } 
      } 
    
    실행 결과는 다음과 같습니다.
  • 부류 - 정적 속성
  • 부류 - 정적 코드 블록
  • 정적 속성
  • 정적 코드 블록
  • 부류 - 비정적 속성
  • 부류 - 비정적 코드 블록
  • 부류―무참구조 함수
  • 비정적 속성
  • 비정적 코드 블록
  • 무참구조 함수
  • 좋은 웹페이지 즐겨찾기