博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java父子类加载顺序
阅读量:6925 次
发布时间:2019-06-27

本文共 1554 字,大约阅读时间需要 5 分钟。

加载顺序

先上桌结论:

父类静态属性(成员变量) > 父类静态代码块 > 子类静态属性 > 子类静态代码块 > 父类非静态属性 > 父类非静态代码块 > 父类构造器 > 子类非静态属性 > 子类非静态代码块 > 子类构造器

这么长怎么记呀?!

这里帮大家小结几个特点:

  1. 静态属性和代码块,当且仅当该类在程序中第一次被 new 或者第一次被类加载器调用时才会触发(不考虑永久代的回收)。也正是因为上述原因,类优先于对象 加载/new,即 静态优先于非静态
  2. 属性(成员变量)优先于构造方法,可以这么理解,加载这整个类,需要先知道类具有哪些属性,并且这些属性初始化完毕之后,这个类的对象才算是完整的。另外,非静态代码块其实就是对象 new 的准备工作之一,算是一个不接受任何外来参数的构造方法。因此,属性 > 非静态代码块 > 构造方法
  3. 有趣的是,静态部分(前4个)是父类 > 子类,而 非静态部分(后6个)也是父类 > 子类
  4. 另外容易忽略的是,非静态代码块在每次 new 对象时都会运行,可以理解:非静态代码块是正式构造方法前的准备工作(非静态代码块 > 构造方法)。

测试代码如下:

/** * @author Lean.Li * @date 2018/10/15 */public class Main {    static class A {        static Hi hi = new Hi("A");        Hi hi2 = new Hi("A2");        static {            System.out.println("A static");        }        {            System.out.println("AAA");        }        public A() {            System.out.println("A init");        }    }    static class B extends A {        static Hi hi = new Hi("B");        Hi hi2 = new Hi("B2");        static {            System.out.println("B static");        }        {            System.out.println("BBB");        }        public B() {            System.out.println("B init");        }    }    static class Hi {        public Hi(String str) {            System.out.println("Hi " + str);        }    }    public static void main(String[] args) {        System.out.println("初次 new B:");        B b = new B();        System.out.println();        System.out.println("第二次 new B:");        b = new B();    }}

运行结果如下:

初次 new B:Hi AA staticHi BB staticHi A2AAAA initHi B2BBBB init第二次 new B:Hi A2AAAA initHi B2BBBB init

转载地址:http://jdjjl.baihongyu.com/

你可能感兴趣的文章
Maven pom.xml配置解读
查看>>
SVN clearup提示Path is not a working copy directory
查看>>
15种最佳方式帮你顺利掌握Hadoop技术
查看>>
读写分离
查看>>
emacs+cscope阅读C代码
查看>>
ILGeoNamesSearchController
查看>>
js学习笔记
查看>>
微博舆情监测
查看>>
Flink 幕后之内存管理
查看>>
javascript 学习笔记 【数组操作方法】
查看>>
Android 实现ListView的展开式动画ExpandAnimation
查看>>
PreparedStatement 与Statement 区别
查看>>
mybatis增删改查配置
查看>>
分析APACHE NGINX的LOG
查看>>
android studio 无法在可视化页面预览布局文件
查看>>
结构体初始化的一点注意 -std=gnu++0x
查看>>
SQL Server里查询表结构命令
查看>>
自动发送Exchange Server 2013使用情况到指定邮箱
查看>>
【Shell脚本】逐行处理文本文件
查看>>
mysql视图学习总结
查看>>