Java中静态代码块、构造代码块、构造方法代码块、父子类代码块之间执行顺序及代码示例
1、静态代码块
public class HelloA {
public HelloA() {
("constructor A...");
}
//这是构造代码块,而且在new对象时,构造代码块优先构造方法执行
{
("I'm A class");
}
//使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态属性初始化
//静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次!
//静态代码块
static {
("static A");
}
public static void main(String[] args) {
}
}
运行结果:
static A
2、构造代码块、构造方法
public class HelloA {
public HelloA() {
("constructor A...");
}
//这是构造代码块,而且在new对象时,构造代码块优先构造方法执行
{
("I'm A class");
}
//使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态属性初始化
//静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次!
//静态代码块
static {
("static A");
}
public static void main(String[] args) {
HelloA helloA = new HelloA();
}
}
运行结果:
3、main主方法代码
public class HelloA {
public HelloA() {
("constructor A...");
}
//这是构造代码块,而且在new对象时,构造代码块优先构造方法执行
{
("I'm A class");
}
//使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态属性初始化
//静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次!
//静态代码块
static {
("static A");
}
public static void main(String[] args) {
("main start");
HelloA helloA = new HelloA();
("main end");
}
}
运行结果:
static A
main start
I'm A class
constructor A...
main end
4、子类和父类的代码块
public class HelloB extends HelloA {
private static String str = "1";
public HelloB() {
("constructor B...");
}
//这是构造代码块,而且在new对象时,构造代码块优先构造方法执行
{
("I'm B class");
}
//使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态属性初始化
//静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次!
//静态代码块
static {
("static B");
}
/**
* 代码块的执行顺序:静态代码块->main方法的代码->构造代码块->构造方法->顺序执行代码(或同步代码块)
* 继承类代码块的执行顺序:父类静态代码块->子类静态代码块->main方法的代码->父类构造代码块->父类构造方法->子类构造代码块->子类构造方法->顺序执行代码(包括普通代码块、同步代码块)
* @param args
*/
@SuppressWarnings("unused")
public static void main(String[] args) {
("main method start");
HelloB helloB = new HelloB();
("main method end");
//同步代码块
synchronized(str){
("同步代码块:" + str);
}
//普通代码块
{
int x = 10;
("普通代码块x=" + x);
}
}
}
运行结果:
static A
static B
main method start
I'm A class
constructor A...
I'm B class
constructor B...
main method end
同步代码块:1
普通代码块x=10
5、总结:
代码块的执行顺序:静态代码块->main方法的代码->构造代码块->构造方法->顺序执行代码(或同步代码块)
继承类代码块的执行顺序:父类静态代码块->子类静态代码块->main方法的代码->父类构造代码块->父类构造方法->子类构造代码块->子类构造方法->顺序执行代码(包括普通代码块、同步代码块)