先上 demo:
public class A extends B{
{
System.out.println("1");
}
static {
System.out.println("2");
}
A(){
System.out.println("3");
}
public static void main(String[] args) {
new A();
}
}
public class B {
static A a = new A();
{
System.out.println("4");
}
static {
System.out.println("5");
}
B(){
System.out.println("6");
}
}
求程序执行最终结果.
-
初试
乍看代码 A 类继承 B 类,然后又不知道继承类与'构造块'&'构造器'&'static 修饰的成员变量'的执行顺序
我们可以尝试在脑子里运行一边。我这边直接解释 java 这块运行规则。然后再对对答案吧。 -
规则
java 类的初始化
- 类初始化时先加载父类,而类的加载的优先级最高的是 static 静态修饰符
- static 按顺序重上到下执行
- 构造块 > 构造器(加载顺序)
-
answer
4613524613
你答对了吗 👍
- 知识扩展
双亲委派模式及优势
双亲委派模式的工作原理的是;如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式,即每个儿子都不愿意干活,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己想办法去完成,这不就是传说中的双亲委派模式.那么这种模式有什么作用呢?
answer
- 双亲委派模式优势.
- 采用双亲委派模式的是好处是 Java 类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子 ClassLoader 再加载一次。其次是考虑到安全因素,java 核心 api 中定义类型不会被随意替换,假设通过网络传递一个名为 java.lang.Integer 的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心 Java API 发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的 java.lang.Integer,而直接返回已加载过的 Integer.class,这样便可以防止核心 API 库被随意篡改。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于