浅谈Java父子类加载顺序
先上桌结论,优先被加载的顺序如下:
父类静态成员变量 > 父类静态代码块 > 子类静态成员变量 > 子类静态代码块 > 父类非静态成员变量 > 父类非静态代码块 > 父类构造方法 > 子类非静态成员变量 > 子类非静态代码块 > 子类构造方法
这么长怎么记呀?!
这里帮大家小结几个特点:
- 成员变量 > 代码块 > 构造方法(构造器)。
- 静态(共有) > 非静态(私有)。
- 子类静态 > 父类非静态(私有)。
其实这也是 类优先于对象被加载 的体现。
2. 成员变量 > 成员方法 > 构造方法
- 可以这么理解,加载这整个类,需要先知道类具有哪些成员变量,并且这些属性初始化 (private String A = ""; 或者 private String A; ) 完毕之后,这个类的对象才算是完整的。
- 其实 初始化非静态成员变量 就是 new 对象的准备工作之一,等效于一个不接受任何类外部参数的构造方法。非静态代码块也同理。因此,成员变量 > 非静态代码块 > 构造方法。
测试代码如下:
/** * @author Ander.Li */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("A non static"); }public A() {System.out.println("A init"); } }// B 是 A 的子类 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("B non static"); }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("[First] new B:"); B b = new B(); System.out.println(); System.out.println("[Second] new B:"); b = new B(); }}
运行结果如下:
[First] new B:【浅谈Java父子类加载顺序】到此这篇关于Java父子类加载顺序的实现的文章就介绍到这了,更多相关Java父子类加载顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
Hi A
A static
Hi B
B static
Hi A2
A non static
A init
Hi B2
B non static
B init
[Second] new B:
Hi A2
A non static
A init
Hi B2
B non static
B init
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 那件我们忽略的小事叫感恩
- 事件代理
- 有父母作榜样的家才是真正的学区房
- 老了的父母
- 父母越不讲道理,孩子反而越优秀!说的是你吗()
- 孩子不是实现父母欲望的工具——林哈夫
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一