代码块的执行顺序
程序员文章站
2022-07-15 18:06:49
...
在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
1.在非主类中的静态块
class Person{
{//定义在类中,不加任何修饰符
System.out.println("1.Person类的构造块");
}
}
public Person(){
System.out.println("2.Person类的构造方法");
}
static{//使用static定义的代码块
System.out.println("3.定义在非主类中的静态块");
}
}
public class Test{
public static void main(String[] args) {
System.out.println("--start--");
new Person();
new Person();
System.out.println("--end--");
}
}
结论:
**前提:**在非主类的静态块
1.执行的优先级为静态块>构造块>构造方法
2.无论产生多少实例化对象,静态块都只执行一次
3.每产生一个新的对象就调用一次构造块
2.在主类中的静态块
public class Test{
{//定义在类中,不加任何修饰符
System.out.println("1.Test的构造块");
}
public Test(){
System.out.println("2.Test的构造方法");
}
static{//使用static定义的代码块
System.out.println("3.定义在主类中的静态块");
}
public static void main(String[] args) {
System.out.println("--start--");
new Test();
new Test();
System.out.println("--end--");
}
}
结论:在主类中定义的静态块优先于主方法(main)执行。
补充:
1.构造块的作用:给对象进行初始化,对象一建立就运行,而且优先于构造方法执行。
2.构造块和构造方法的区别:构造块是给所有对象进行统一初始化;而构造方法是给对应的对象初始化。
3.构造块中定义的是不同对象共性的初始化内容。
3.存在继承时的运行顺序
class B extends Object{
static {
System.out.println("Load B");
}
public B() {
System.out.println("Creat B");
}
}
class A extends B{
static {
System.out.println("Load A");
}
public A() {
System.out.println("Creat A");
}
}
public class Testclass {
public static void main(String[] args) {
new A();
}
}
Java程序的初始化一般遵循3个原则(优先级依次递减):
- 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。
- 父类优先于子类进行初始化。
- 按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造方法)被调用之前先初始化。