zoukankan      html  css  js  c++  java
  • 一起探索下java的类初始化顺序

    一个java类里面有代码块、变量、构造方法,而代码块和变量都有静态和非静态,它们的初始化顺序又是怎样的呢,是否跟编写的先后顺序有关?

    1⃣️先上代码

    public class InitTest {
        
        private int a=a();
        
        private static int b=b();
        
        {
            System.out.println("初始化非静态代码块");
        }
        
        static {
            System.out.println("初始化静态代码块");
        }
        
        public InitTest(){
            super();
            System.out.println("初始化构造方法");
        }
        
        private int a(){
            System.out.println("初始化非静态变量");
            return 0;
        }
        
        private static int b(){
            System.out.println("初始化静态变量");
            return 0;
        }
        
    }

    执行结果:

    初步分析是先初始化静态的,在初始化非静态,最后才是构造方法。

    最后我们分析一下,如果都是静态或者都是非静态,究竟是先初始化代码块先还是变量先。

    ok,还是先上代码,这里我只演示都是静态的

    public class InitTest {
        
        private static int a=a();
        static {
            System.out.println("初始化静态代码块");
        }
    
        private static int b=b();
        
        private static int a(){
            System.out.println("初始化静态变量a");
            return 0;
        }
        
        private static int b(){
            System.out.println("初始化静态变量b");
            return 0;
        }
        
    }

    执行结果

    由这里可以看到,同时静态,初始化顺序是由编译是代码从上到下

    了解一个类的初始化顺序在开发中是非常非常重要的 

    补充一下,如果有父类并且子类有调用super(...),那么就会先初始化父类再初始化子类

  • 相关阅读:
    codeforce 272B Dima and Sequence
    Codeforce 270D Greenhouse Effect
    codeforce 270C Magical Boxes
    codeforce 270B Multithreading
    图论--Dijkstra算法总结
    图论--(技巧)超级源点与超级汇点
    图论--Floyd总结
    ZOJ 3932 Handshakes
    ZOJ 3932 Deque and Balls
    ZOJ 3927 Programming Ability Test
  • 原文地址:https://www.cnblogs.com/pig-brother/p/7226213.html
Copyright © 2011-2022 走看看