Flask接口签名sign原理与实例代码浅析
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~