我知道,当我创建一个实例时,静态块首先初始化,然后是代码块,然后是构造函数--我的代码
public class Main{
public Main() {
out.println("constructor initialised");
}
static {
out.println("static block initialised");
}
{
out.println("Code block initialised");
}
public static void main(String... args) {
new Main();
}
}
输出像这样
静态块初始化
代码块初始化
构造函数初始化
上面的输出澄清了我的概念,但是当我像这样扩展一些类时
public class Main extends Bear{
public Main() {
out.println("constructor initialised");
}
static {
out.println("static block initialised");
}
{
out.println("Code block initialised");
}
public static void main(String... args) {
new Main();
}
}
熊类
class Bear{
static {
out.println("static block initialised of bear class");
}
{
System.out.println("Code bLock initialised of bear class");
}
void run() {
out.println("running...");
}
}
输出如下:
熊类初始化的静态块
静态块初始化
熊类初始化的代码bLock
代码块初始化
构造函数初始化
当扩展类时,执行顺序改变了,我不明白为什么会发生上面的输出
发布于 2021-06-26 02:54:40
我相信这些工作的方式是:
当首次加载类时(基本上是在项目中首次使用类时)调用first
它们按此顺序出现的原因是,子类依赖于存在的父类。不能在父类之前加载子类,因此调用父类的静态初始化来加载它,然后加载子类。
加载每个类之后,它将调用构造函数(包括非静态代码块)来初始化对象。同样,子类取决于父类的存在和正确设置,因此首先调用基类构造函数,然后调用派生类构造函数。需要按照这个顺序来完成,这样子类就可以依赖于父类的某些参数。如果将显式构造函数添加到基类中,则会得到如下所示的输出:
类被加载。
基类构造函数
class
子类构造函数
initialised
如果您两次调用new (),您将在第一次看到上面的输出,但是静态块可能会在第二次丢失,因为类已经被加载了。
https://stackoverflow.com/questions/68138774
复制相似问题