java成员初始化顺序_Java成员初始化顺序

1. 初始化顺序

在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量散布于方法定义之间,他们仍会在任何方法(包括构造器)被调用之前初始化。

2. 静态成员初始化顺序

1⃣️初始化类的静态成员或者静态块,静态初始化只在Class对象首次加载的时候进行一次。

2⃣️执行构造器

3⃣️初始化非静态成员

例如:

public classAnimal {publicAnimal(String name) {

System.out.println("Animal [" + name + "]");

}public voidm1() {

System.out.println("Animal.m1 is invoked.....");

}

}

public classCar {publicCar(String name) {

System.out.println("Car [" + name + "]");

}public voidm1() {

System.out.println("Car.m1 is invoked.....");

}

}

public classTable {static Animal a1 = new Animal("a1");

Table() {

a1.m1();

}public voidm1() {

System.out.println("Table.m1 is invoked.....");

}static Car c1 = new Car("c1");

}

public classStaticInitialization {static Table t1 = newTable();static Table t2 = newTable();public static voidmain(String[] args) {

System.out.println(t1.a1==t2.a1);

}

}

输出结果:

Animal [a1]

Car [c1]

Animal.m1 is invoked.....

Animal.m1 is invoked.....true

由输出结果,可以看出t1和t2的成员a1是同一个对象,说明Table类的静态成员a1,c1只初始化了一次。

3. 非静态实例初始化

Java中也有被称为实例初始化的类似语法,用来初始化每一个对象的非静态变量。同样,初始化是发生在构造器之前的。

例如:

public classMug {

Mug(intmarker) {

System.out.println("Mug[" + marker + "]");

}

}

public classMugs {

Mug mug1;

Mug mug2;

static Mug mug3;//非静态成员初始化

{

mug1= new Mug(1);

mug2= new Mug(2);

}

static {

mug3 = new Mug(3);

}

Mugs() {

System.out.println("Mugs is created...");

}

}

public static voidmain(String[] args) {

Mugs mugs= newMugs();

}

输出结果:

Mug[3]

Mug[1]

Mug[2]

Mugs is created..

从输出结果可以看出,实例初始化子句是在静态代码块之后,构造器之前执行的。

这种语法对于支持”匿名内部类“的初始化是必须的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值