2哥:3妹,你了解Java中的父子类吗?
3妹:这个了解啊, 有了父类、子类的概念,所以Java才有了继承、多态。
2哥:nice, 很好,那你知道父子类中变量,代码块,构造器之间执行顺序是怎样的吗?
3妹:emmm……这个太多了,我还没有理明白。
2哥:今天我们就来学习这个。
Java程序中类中个元素的初始化顺序 初始化的原则是:
- 先初始化静态部分,再初始化动态部分,
- 先初始化父类部分,后初始化子类部分,
- 先初始化变量,再初始化代码块和构造器。
所以依照这个规则可以得出总体顺序是:
1.父类的静态成员变量(如果是第一次加载类)
2.父类的静态代码块(如果是第一次加载类)
3.子类的静态成员变量(如果是第一次加载类)
4.子类的静态代码块(如果是第一次加载类)
5.父类的普通成员变量
6.父类的动态代码块
7.父类的构造器方法
8.子类的普通成员变量
9.子类的动态代码块
10.子类的构造器方法
示例:
下面写了一个Demo进行验证:
public class Base {
static Instance staticInstance = new Instance("1---Base类的静态成员变量staticInstance");
static {
System.out.println("2---Base类的静态代码块执行了");
}
Instance instance = new Instance("5---Base类的普通成员变量instance");
{
System.out.println("6---Base类的动态代码块执行了");
}
Base() {
System.out.println("7---Base类的构造器方法执行了");
}
}
public class Child extends Base {
static Instance staticInstance = new Instance("3---Child类的静态成员变量staticInstance");
static {
System.out.println("4---Child类的静态代码块执行了");
}
Instance instance = new Instance("8---Child类的普通成员变量instance");
{
System.out.println("9----Child类的动态代码块执行了");
}
Child() {
System.out.println("10---Child类的构造器方法执行了");
}
public static void main(String[] args) {
Child child = new Child();
}
}
输出结果如下:
1---Base类的静态成员变量staticInstance进行了初始化
2---Base类的静态代码块执行了
3---Child类的静态成员变量staticInstance进行了初始化
4---Child类的静态代码块执行了
5---Base类的普通成员变量instance进行了初始化
6---Base类的动态代码块执行了
7---Base类的构造器方法执行了
8---Child类的普通成员变量instance进行了初始化
9----Child类的动态代码块执行了
10---Child类的构造器方法执行了点击复制代码复制出错复制成功
说明确实是按照上面的执行顺序执行的。
网友评论