• 例一:

    public class Solution {
        //public static Solution s1=new Solution();
    
        public Solution(){
            System.out.println("构造方法");
        }
    
        {
            System.out.println("普通代码块:blockA");
        }
    
        static{
            System.out.println("静态代码块:blockB");
        }
    
        public static void main(String[] args) {
            System.out.println("hello");
            //Solution s2=new Solution();
        }
    }

    结果:

    静态代码块:blockB
    hello

    分析:

    ​ 由于main函数是一个静态方法,在调用这个静态方法时,会对类Solution进行初始化,而类初始化阶段,会对静态变量静态代码块按照顺序执行,所以此处会先执行静态代码块的内容,然后输出”helllo“。

  • 例二

    public class Solution {
        public static Solution s1=new Solution();
    
        public Solution(){
            System.out.println("构造方法");
        }
    
        {
            System.out.println("普通代码块:blockA");
        }
    
        static{
            System.out.println("静态代码块:blockB");
        }
    
        public static void main(String[] args) {
            System.out.println("hello");
            //Solution s2=new Solution();
        }
    }

    结果:

    普通代码块:blockA
    构造方法
    静态代码块:blockB
    hello

    分析:

    • 调用main静态方法时,会对类Solution进行初始化。
    • 在类Solution内部,静态变量s1需要new一个Solution对象,所以执行了相关的非静态的代码,其中,普通代码块的执行优先于构造方法。
    • 在此之后执行静态代码块的代码,最后输出"hello"。
  • 例三:

    public class Solution {
        public static Solution s1=new Solution();
    
        public Solution(){
            System.out.println("构造方法");
        }
    
        {
            System.out.println("普通代码块:blockA");
        }
    
        static{
            System.out.println("静态代码块:blockB");
        }
    
        public static void main(String[] args) {
            System.out.println("hello");
            Solution s2=new Solution();
        }
    }

    结果:

    普通代码块:blockA
    构造方法
    静态代码块:blockB
    hello
    普通代码块:blockA
    构造方法

    分析:

    • 在例二的基础上,又有Solution类的对象s2,new一个类对象的应该按照静态变量——静态代码块——普通代码块——构造方法的顺序执行。但是,由于静态变量和静态代码块在前面已经初始化过了,所以此处不用再做,仅仅执行普通代码块和构造方法。
  • 例四:普通new一个对象的步骤

    public class Solution {
        //public static Solution s1=new Solution();
    
        public Solution(){
            System.out.println("构造方法");
        }
    
        {
            System.out.println("普通代码块:blockA");
        }
    
        static{
            System.out.println("静态代码块:blockB");
        }
    
        public static void main(String[] args) {
            //System.out.println("hello");
            Solution s2=new Solution();
        }
    }

    结果:

    静态代码块:blockB
    普通代码块:blockA
    构造方法

    分析:

    • 按照静态变量——静态代码块——普通代码块——构造方法的顺序执行。
  • 例五:包含父类的情况

    父类
    class FatherClass {
        // 静态变量 
        public static String parent_StaticField = "父----静态变量";
        // 变量
        public String parent_Field = "父类----普通变量";
        // 静态初始化块
        static {
            System.out.println(parent_StaticField);
            System.out.println("父类------静态初始化块");
        }
        // 初始化块 
        {
            System.out.println(parent_Field);
            System.out.println("父类-----初始化块");
        }
        // 构造器 
        public FatherClass() {
            System.out.println("父类--构造器");
        }
    }
    子类
    public class SubSon extends FatherClass  {
        // 静态变量
        public static String son_StaticField = "子类--静态变量";
        // 变量 
        public String son_Field = "子类--变量";
        // 静态初始化块
        static {
            System.out.println(son_StaticField);
            System.out.println("子类--静态初始化块");
        }
        // 初始化块 
        {
            System.out.println(son_Field);
            System.out.println("子类--初始化块");
        }
        // 构造器
        public SubSon(){
            System.out.println( "子类--构造器" );
        }
        public static void main(String[] args) {
            System.out.println("子类-----main方法");
            new SubSon();
        }
    }

    结果:

    父----静态变量
    父类------静态初始化块
    子类--静态变量
    子类--静态初始化块
    子类-----main方法
    父类----普通变量
    父类-----初始化块
    父类--构造器
    子类--变量
    子类--初始化块
    子类--构造器

    结合一张图(图源见水印):
    image.png


未期
1 声望1 粉丝

加油做一名高质量的技术分享者!