JAVA 静态代码块 父子构造方法 执行顺序

要点

  • 静态的代码块一定比构造方法先执行
  • 如果都是静态代码,一个类里面,按照先后顺序执行,父子之间,父类静态代码块先
  • 静态代码只会执行一次,多次new 新的对象,构造方法,非静态代码块会多次执行

一个类里面,静态代码块,构造方法

package com.javabase;

/**
 * @Description: java类作用描述
 * @Author: Bsea
 * @CreateDate: 2019/6/14$ 21:00$
 */
public class ConstroctTest {
    // 成员变量,声明并且赋值
    private static ConstroctTest test = new ConstroctTest();
    //静态变量sta1    未赋予初始值
    public static int sta1;
    //静态变量sta1    赋予初始值20
    public static int sta2 = 20;
    //构造方法中对于静态变量赋值
    private ConstroctTest() {
        sta1 ++ ;
        sta2 ++ ;
        System.out.println("构造方法里面sta1=="+sta1);
        System.out.println("构造方法里面sta2=="+sta2);
    }
    public static void main(String[] args) {
        //1, 静态变量的赋值一定比构造方法先执行
        //2,如果都是静态变量,按照顺序执行
        //3,  基本类型,没有初始化的时候,会有默认值
        //4, 这个类一共有三个静态变量(按代码顺序:test,stat1,stat2)
        //5. 在给静态变量test赋值的时候,会需要调用构造方法
        //这个时候,构造方法把stat1变成了1,stat2也变成了1
        //6, test,赋值完成以后stat1,stat1都是1
        //7. public static int sta1;这里只声明,没有赋值所以没
        //有改变sta1的值
        //8.public static int sta2 = 20;做了赋值运算
        //把sta2从1变成了20
        System.out.println(ConstroctTest.sta1);//1
        System.out.println(ConstroctTest.sta2);//20
    }
}

运行结果

com.javabase.ConstroctTest
构造方法里面sta11
构造方法里面sta2
1
1
20

父子之间

package com.javabase;

/**
 * @Description: java类作用描述
 * @Author: Bsea
 * @CreateDate: 2019/6/14$ 22:02$
 */
public class A {
        static {
            System.out.println("A的静态块");
        }
        private static String staticStr = getStaticStr();
        private String str = getStr();
        {
            System.out.println("A的实例块");
        }
        public A() {
            System.out.println("A的构造方法");
        }
        private static String getStaticStr() {
            System.out.println("A的静态属性初始化");
            return null;
        }
        private String getStr() {
            System.out.println("A的实例属性初始化");
            return null;
        }
        public static void main(String[] args) {
            new B();
            new B();
        }

    }
    class B extends A{
        private static String staticStr = getStaticStr();
        static {
            System.out.println("B的静态块");
        }
        {
            System.out.println("B的实例块");
        }
        public B() {
            System.out.println("B的构造方法");
        }
        private String str = getStr();
        private static String getStaticStr() {
            System.out.println("B的静态属性初始化");
            return null;
        }
        private String getStr() {
            System.out.println("B的实例属性初始化");
            return null;
        }
    }

执行结果:

A的静态块
A的静态属性初始化
B的静态属性初始化
B的静态块
A的实例属性初始化
A的实例块
A的构造方法
B的实例块
B的实例属性初始化
B的构造方法
A的实例属性初始化
A的实例块
A的构造方法
B的实例块
B的实例属性初始化
B的构造方法

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/h356363/article/details/92175143