创建对象时类的调用顺序

代码块

1.创建一个对象时,在一个类中调用的顺序是:

1.调用静态代码块和静态属性初始化(优先级相同,如果有多个,则按他们定义的顺序调用)
2.调用普通代码块和普通属性的初始化(优先级相同,如果有多个,则按他们定义的顺序调用)
3.构造方法是最后才调用

实例:

package com.example.Codeblock;
/**
* @author gaoqinghui
* @date 2022/4/26 22:35
public class CodeBlockDetail02 {
public static void main(String[] args) {
Detail01 detail01 = new Detail01();
}
}
class Detail01 {
private int n2 = getN2(); //非静态属性
//普通代码块
{
System.out.println("Detail01普通代码块被执行");
}
//下面这个是静态属性初始话,调用顺序的优先级和静态代码块相同
//如果都两个都有,按放置的位置来决定谁先背调用
private static int n1 = getN1();
static {
System.out.println("Detail01静态代码块被执行");
}
public static int getN1() {
System.out.println("getN1被调用");
return 100;
}
public int getN2() { //非静态方法
System.out.println("getN2被调用");
return 200;
}
//无参构造器
public Detail01() {
System.out.println("Detail01()构造器被调用");
}
}

2.构造器的最前面其实隐含了super()和调用普通代码块,但是静态相关的代码块和静态属性初始化是最先执行的,不管在什么时候,因为在类加载时就执行了静态相关的代码块和静态属性初始化。

package com.example.Codeblock;
/**
* @author gaoqinghui
* @date 2022/4/26 23:03
*/
public class CodeBlockDetail03 {
public static void main(String[] args) {
new BBB();
//输出结果:1.AAA的静态代码块被执行 2.AAA()构造器被执行 3.BBB普通代码块被执行 4.BBB()构造器被执行
}
}
class AAA {
//进来后先找静态代码块,再找普通代码块,再找构造器
static {
System.out.println("AAA的静态代码块被执行");
}
public AAA() {
//super(); 去找object的构造器
//本类普通代码块
System.out.println("AAA()构造器被执行");
}
{
System.out.println("AAA的普通代码块被执行");
}
}
class BBB extends AAA{
{
System.out.println("BBB普通代码块被执行");
}
public BBB() {
//super(); 去到父类中先找静态代码块,再找普通代码块,再找构造器
//调用本类普通代码块
System.out.println("BBB()构造器被执行");
}
}

3.创建一个子类时(有继承关系),他们的静态代码块、静态属性初始化、普通代码块、普通属性初始化,构造方法的调用顺序如下:

1. 父类的静态代码块和静态属性初始化(优先级一样,按定义顺序执行);
2. 子类的静态代码块和静态属性初始化(优先级一样,按定义顺序执行);
3. 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行);
4. 父类的构造方法;
5. 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行);
6. 子类的构造方法;
posted @   忧愁小松鼠  阅读(136)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示