Java에서 자유 블록 실행 순서

  • java의 자유 블록은 정적 자유 블록과 비정적 자유 블록으로 나뉜다.
  • 비정적 자유 블록의 실행 시간은 구조 함수를 실행하기 전이다.
  • 정적 자유 블록의 실행 시간은:class 파일이 불러올 때 실행됩니다.
  • 비정적 자유 블록은 여러 번 실행할 수 있으며 대상을 초기화하면 실행되지만 정적 자유 블록은 클래스가 불러올 때 한 번만 실행됩니다. 일반적으로 클래스의 정적 변수 값을 초기화하는 데 사용됩니다.
  • 매번 대상을 초기화할 때마다 비정적 블록의 실행을 초래한다.
  • 만약에 계승과 관련된다면 먼저 부류의 비정태 블록을 집행하고 그 다음은 부류의 구조 함수, 그 다음은 자신의 자유 블록, 마지막은 자신의 구조 함수이다
  • 정적 블록의 실행 시기는class 파일이 불러올 때,class 파일은 한 번만 불러오기 때문에 정적 블록은 한 번만 실행하고, 다음에 이 클래스를 사용할 때 정적 블록을 다시 실행하지 않습니다. 
  • 정적 블록의 실행 시기는class가 불러온 후의 초기화 단계입니다.클래스만 불러오고 초기화하지 않는 ClassLoader의loadclass를 사용하면 정적 블록의 실행을 촉발하지 않습니다.Class를 사용하는 forname (String) 은 기본 initialize를true로 하는 경우, 즉 초기화됩니다.forname(String name,boolean initialize,ClassLoader loader)을 사용하면 initialize를false로 설정하면 정적 블록을 실행하지 않습니다.
  • 클래스 마운트를 실행한 후의 초기화 단계는 실행 방법을 포함하는데 이 방법은 클래스 변수의 초기화 문장과 정적 자유 블록 문장이다.이 방법은 자바의 컴파일러가 정보를 수집하여 생성한 것으로 표시할 수 없는 호출입니다..
  • 다음은 예를 들어 설명합니다.
    부류

    father.java

    public class father {

        static{//
           System.out.println("father'sSTATIC free block running");
        }

        {//
     System.out.println("father'sfree block running");
        }

        public father(){

           System.out.println("father'sconstructor running");

        }
    }

    하위 클래스

    son.java
    public class son extends father{
        static{//
           System.out.println("son'sSTATIC free block running");
        }

        {//
           System.out.println("son's freeblock running");
        }

        public son() {
           // TODO Auto-generated constructor stub
           System.out.println("son'sconstructor running");
        }
    }

    주 함수가 있는 클래스

    test.java

    public class test{

          public static void main(String[] args) {

           Class f;

           try {

               System.out.println("--------beforeload father--------");

               f=Class.forName("freeblock.father");

               System.out.println("--------afterload father---------");        

               System.out.println("--------beforeinitial father object--------");

               f.newInstance();

               System.out.println("--------afterinitial father object--------");

           } catch (ClassNotFoundException e) {

               e.printStackTrace();

           } catch (InstantiationException e) {
               e.printStackTrace();

           } catch (IllegalAccessException e) {

               e.printStackTrace();
           }     
           Class s;

           try {

               System.out.println("-------beforeload son--------");

               s=Class.forName("freeblock.son");

               System.out.println("--------afterload son-------");

               System.out.println("--------beforeinitial son object----------");

               s.newInstance();

               System.out.println("--------afterinitial son object-----------");

           } catch (ClassNotFoundException e) {
               e.printStackTrace();
           } catch (InstantiationException e) {
               e.printStackTrace();
           } catch (IllegalAccessException e) {
               e.printStackTrace();
           }
        }
    }

    실행 결과:
    --------before loadfather--------
    father's STATIC free blockrunning
    --------after loadfather---------
    --------before initial fatherobject--------
    father's free block running
    father's constructor running
    --------after initial fatherobject--------
    -------before load son--------
    son's STATIC free block running
    --------after load son-------
    --------before initial sonobject----------
    father's free block running
    father's constructor running
    son's free block running
    son's constructor running
    --------after initial son object-----------

    좋은 웹페이지 즐겨찾기