【Java 进阶】类成员初始化顺序

首先看下这段测试代码

public class ClassLoader {

    public static void main(String[] args) {
        // 3.第四步,new一个类,但在new之前要处理匿名代码块
        new ClassLoader();                         
    }

    // 1.第二步,静态变量和静态代码块的加载顺序由编写先后决定
    static int sNum = 4;                           

    // 2.第三步,静态块,然后执行静态代码块,因为有输出,故打印
    static {                                       
        System.out.println("静态方法块执行");
    }

    // 4.第五步,按照顺序加载匿名代码块,代码块中有打印
    {
        System.out.println("静态变量 =" + sNum);    
        sNum += 3;
        System.out.println("类方法快执行");
        System.out.println("静态变量 =" + sNum);
    }

    // 5.第六步,按照顺序加载变量
    int mNum = 5;   
                                   
    // 6.第七步,按照顺序打印
    { 
        System.out.println("成员方法块执行");           
    }
    
    // 7.第八步,最后加载构造函数,完成对象的建立
    ClassLoader() {        
        System.out.println("成员变量 =" + mNum);
        System.out.println("构造器执行");
    }
    
    // 8.静态方法,调用的时候才加载
    static void run()    
    {
        System.out.println("static function");
    }

    // 8.内部类,调用的时候才加载
    static class Interior {    
        static {
            System.out.println("Interior");
        }
    }

}

看下输出结果

输出结果

输出结果表明,程序的执行顺序为:
如果类还没有被加载:
1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
2、执行子类的静态代码块和静态变量初始化。
3、执行父类的实例变量初始化
4、执行父类的构造函数
5、执行子类的实例变量初始化
6、执行子类的构造函数

如果类已经被加载:
则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,695评论 0 11
  • 父类 static 块 1 执行 父类 静态成员staticSam1初始化 父类 静态成员staticSam2初始...
    YCix阅读 1,347评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • 前言 YY:Kitty,我最近在看Thinking in Java 这本书Kitty:喔?是么,你不是一直觉得那本...
    LilacZiyun阅读 5,542评论 12 51
  • 最近写文毫无灵感,思来想去原因找到,我没故事写了。 网络上千篇一律的玩意儿太多。都是我的一个朋友,同学,同桌,小伙...
    吴希道阅读 326评论 0 6