前些天再看对象的初始化,发现了一个很有意思的点。
创建对象时,对象初始化,正常顺序,如果对象中有静态代码块,先执行静态代码块,再执行代码块,再执行构造器。
class Demo{
static {
System.out.println("静态代码块");
}
{
System.out.println("普通代码块");
}
Demo(){
System.out.println("构造器");
}
}
class Test{
public static void main(String[] args) {
Demo demo = new Demo();
}
}
输出:
静态代码块
普通代码块
构造器
但是如果我们在类中创建一个静态对象时,就会先执行代码块。
class Demo {
static Demo d=new Demo();
static {
System.out.println("静态代码块");
}
{
System.out.println("普通代码块");
}
Demo() {
System.out.println("构造器");
}
}
class Test {
public static void main(String[] args) {
Demo demo = new Demo();
}
}
输出:
普通代码块
构造器
静态代码块
普通代码块
构造器
如果在类中创建其他类的静态对象就不会出现这种现象。
class Demo1 {
static Demo2 d2=new Demo2();
static {
System.out.println("Demo1静态代码块");
}
{
System.out.println("Demo1普通代码块");
}
Demo1() {
System.out.println("Demo1构造器");
}
}
class Demo2{
{
System.out.println("Demo2普通代码块");
}
static {
System.out.println("Demo2静态代码块");
}
Demo2(){
System.out.println("Demo2构造器");
}
}
class Test {
public static void main(String[] args) {
Demo1 demo = new Demo1();
}
}
输出:
Demo2静态代码块
Demo2普通代码块
Demo2构造器
Demo1静态代码块
Demo1普通代码块
Demo1构造器