浅谈Java父子类加载顺序

网友投稿 316 2022-10-07


浅谈Java父子类加载顺序

先上桌结论,优先被加载的顺序如下:

父类静态成员变量 > 父类静态代码块 > 子类静态成员变量 > 子类静态代码块 > 父类非静态成员变量 > 父类非静态代码块 > 父类构造方法 > 子类非静态成员变量 > 子类非静态代码块 > 子类构造方法

这么长怎么记呀?!

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

成员变量 > 代码块 > 构造方法(构造器)。

静态(共有) > 非静态(私有)。

子类静态 > 父类非静态(私有)。

1. 静态 > 非静态

当且仅当该类在程序中第一次被 new(是第一次被类加载器调用时)才会触发(不考虑永久代的回收),但只调用 Main.class 是不会触发的哟。

其实这也是 类优先于对象被加载 的体现。

2. 成员变量 > 成员方法 > 构造方法

可以这么理解,加载这整个类,需要先知道类具有哪些成员变量,并且这些属性初始化 (private String A = ""; 或者 private String A;) 完毕之后,这个类的对象才算是完整的。

其实 初始化非静态成员变量 就是 new 对象的准备工作之一,等效于一个不接受任何类外部参数的构造方法。非静态代码块也同理。因此,成员变量 > 非静态代码块 > 构造方法。

3. 子类静态 > 父类非静态

结合第一条,也比较容易得出这一条规律。

测试代码如下:

/**

* @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 nohttp://n 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 statichttp:// void main(String[] args) {

System.out.println("[First] new B:");

B b = new B();

System.out.println();

System.out.printhttp://ln("[Second] new B:");

b = new B();

}

}

运行结果如下:

[First] new B:

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【IT技术分享】思科防火墙ASA8.4以上IOS如何配置端口映射及PAT(思科asa防火墙配置手册)
下一篇:ciscoasa l2tp raduis and local 单臂模式(ciscoasa 5520active亮红灯)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~