JAVA静的コードブロック、普通コードブロック、静的内部タイプ、一般内部クラスのローディング順序


結論を先に出す
  • 外部クラスの負荷時には、静的変数、静的コードブロックが初期化されますが、静的内部クラスおよび一般的な内部クラス
  • は負荷されません。
  • クラスを実装する場合、クラスの普通コードブロックを初期化し、クラスの構成方法
  • を実行します。
  • 直接クラスの静的内部クラスを呼び出すと、外部クラスはロードされません。
  • テストコード:
    public class ClassLoadTest {
    
        static {
            System.out.println("     ");
        }
        {
            System.out.println("     ");
        }
        public classLoadTest(){
            System.out.println("    ");
        }
        
        public static void main(String[] args) {
    		System.out.println("main    ");
    		    
    }
    	  :
    	     
    	main    
    
    main法を実行する前に、mian法のあるクラスの静的なメンバ(静的変数、静的コードブロックを含む)を初期化するので、静的コードブロックの内容はmian法の前で実行されることが分かる。静的変数と静的コードブロックの初期化サイクルは、コードの作成順に順次実行されます。すなわち、前に書いた人が初期化されます。
    public class ClassLoadTest {
    
        public static long cur_time = System.currentTimeMillis();
    
        static {
            System.out.println("     ");
        }
    
        {
            System.out.println("     ");
        }
    
        public ClassLoadTest(){
            System.out.println("    ");
        }
    
        public static void main(String[] args) {
            System.out.println("main    ");
            ClassLoadTest classLoadTest = new ClassLoadTest();
        }
    }
    	  :
    	     
    	main    
    	     
    	    
    
    私たちは、mainメソッドにおいてクラスの例示的なオブジェクトを作成すると、一般的なコードブロックと構造方法が実行され、一般的なコードブロックは構造方法より先に実行される。
    public class ClassLoadTest {
    
        static {
            System.out.println("     ");
        }
    
        public ClassLoadTest(){
            System.out.println("    ");
        }
    
        public static void main(String[] args) {
            System.out.println("main    ");
            ClassLoadTest classLoadTest = new ClassLoadTest();
        }
    
    	//      
        static  class StaticInnerClass{
            static {
                System.out.println("           ");
            }
        }
        //      
        class InnerClass{
            
            {
                System.out.println("           ");
            }
        }  
    }
    	  :
    	     
    	main    
    	    
    
    外部クラスのローディングまたは外部クラスのインスタンスオブジェクトの作成に関わらず、静的な内部クラスおよび一般的な内部クラスはロードされないことがわかる。
    次に外部クラスにアクセスする静的な内部クラスをテストします。外部クラスはロードされますか?
    public class ClassLoadTest {
        
        static {
            System.out.println("     ");
        }
    
        public ClassLoadTest(){
            System.out.println("    ");
        }
    
        public static void main(String[] args) {
            System.out.println("main    ");
    
        }
    
        static  class StaticInnerClass{
    
            public static long time = System.currentTimeMillis();
    
            static {
                System.out.println("           ");
            }
        }  
    }
    
    //    
    class test{
    
        public static void main(String[] args) {
            System.out.println(ClassLoadTest.StaticInnerClass.time);
        }
    }1567566503291
    
    したがって、外部クラスの静的な内部クラスにアクセスすると、静的な内部クラスのみがロードされます。外部クラスはロードされません。