构造函数,构造代码块,静态函数的执行顺序

静态代码块》构造代码块》构造函数》普通代码块

当调用静态内部列时,并不会引起外部类的初始化

https://blog.csdn.net/qq_27093465/article/details/75339803

1:调用类中的字段

package functionExecutionSequence;

/**
 * @program: GradleTestUseSubModule
 * @author: Yafei Li
 * @create: 2018-09-10 15:22
 **/
public class ClassA {
    public static void main(String[] args){

//        System.out.println("ClassA");
        System.out.println(ClassC.str);
//        System.out.println("----------------------------");
//        ClassC c=new ClassC();
//        System.out.println(c.str);
    }

    static {
        System.out.println("staticClassA");
    }
    {
        System.out.println("contructClassA");
    }

    ClassA(){
        System.out.println("contructFunctionClassA");
    }

}

class ClassB{
    static {
        System.out.println("staticClassB");
    }
    {
        System.out.println("contructClassB");
    }

    ClassB(){
        System.out.println("contructFunctionClassB");
    }
}

class ClassC extends ClassB{
    public static String str="ClassC";
    static {
        System.out.println("staticClassC");
    }
    {
        System.out.println("contructClassC");
    }

    ClassC(){
        System.out.println("contructFunctionClassC");
    }
}

结果: 静态函数中都会执行。

staticClassA
staticClassB
staticClassC
ClassC

2:创建对象实例调用对象中的字段。

package functionExecutionSequence;

/**
 * @program: GradleTestUseSubModule
 * @author: Yafei Li
 * @create: 2018-09-10 15:22
 **/
public class ClassA {
    public static void main(String[] args){

//        System.out.println("ClassA");
        System.out.println(ClassC.str);
        System.out.println("----------------------------");
        ClassC c=new ClassC();
        System.out.println(c.str);
    }

    static {
        System.out.println("staticClassA");
    }
    {
        System.out.println("contructClassA");
    }

    ClassA(){
        System.out.println("contructFunctionClassA");
    }

}

class ClassB{
    static {
        System.out.println("staticClassB");
    }
    {
        System.out.println("contructClassB");
    }

    ClassB(){
        System.out.println("contructFunctionClassB");
    }
}

class ClassC extends ClassB{
    public static String str="ClassC";
    static {
        System.out.println("staticClassC");
    }
    {
        System.out.println("contructClassC");
    }

    ClassC(){
        System.out.println("contructFunctionClassC");
    }
}

执行结果:当调用对象中的属性和行为时,静态代码块都会执行。  构造函数和构造代码块,当创建对象时,才执行。

但是,静态方法只会执行一次。

staticClassA
staticClassB
staticClassC
ClassC
----------------------------
contructClassB
contructFunctionClassB
contructClassC
contructFunctionClassC
ClassC

3:将类中的字段修改为final修饰。

package functionExecutionSequence;

/**
 * @program: GradleTestUseSubModule
 * @author: Yafei Li
 * @create: 2018-09-10 15:22
 **/
public class ClassA {
    public static void main(String[] args){

//        System.out.println("ClassA");
        System.out.println(ClassC.str);
        System.out.println("----------------------------");
//        ClassC c=new ClassC();
//        System.out.println(c.str);
    }

    static {
        System.out.println("staticClassA");
    }
    {
        System.out.println("contructClassA");
    }

    ClassA(){
        System.out.println("contructFunctionClassA");
    }

}

class ClassB{
    static {
        System.out.println("staticClassB");
    }
    {
        System.out.println("contructClassB");
    }

    ClassB(){
        System.out.println("contructFunctionClassB");
    }
}

class ClassC extends ClassB{
    public static final String str="ClassC";
    static {
        System.out.println("staticClassC");
    }
    {
        System.out.println("contructClassC");
    }

    ClassC(){
        System.out.println("contructFunctionClassC");
    }
}

结果:  则类中的静态方法不会调用

staticClassA
ClassC
----------------------------
原文地址:https://www.cnblogs.com/liyafei/p/9620148.html