执行顺序:静态代码块>main函数>构造代码块>构造函数
一、构造函数
class A{
public A(){
//构造函数
}
}
构造函数的注意事项:
- 只有实例化对象时才会调用相应的构造函数,不创建对象构造函数不会被调用
- 使用关键字new来调用构造函数
二、构造代码块
class A{
public A(){
//构造函数1
}
public A(Type t){
//构造函数2
}
{
//构造代码块1
}
{
//构造代码块2
}
}
构造代码块的注意事项:
- 构造代码块又叫初始化块,在一个类的声明中可以包含多个初始化块,相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化块执行
- 只有实例化对象,这些构造代码块才会被执行,且执行顺序优先于构造函数(构造代码块>构造函数),构造代码块依托于构造函数
- 无论使用哪一个构造函数构造对象,首先运行构造代码块,然后再运行相应的构造器。所以不同对象有着相同的初始化块
- 构造代码块和静态代码块的区别是少了static关键字
三、静态代码块
class A{
public A(){
//构造函数1
}
public A(Type t){
//构造函数2
}
{
//构造代码块1
}
{
//构造代码块2
}
static{
//静态代码块1
}
static{
//静态代码块2
}
}
静态代码块的注意事项:
- 静态代码块随着类的加载而执行,并且只执行一次
- 静态代码块只能调用静态变量,不能调用非静态变量
- 静态代码块是用来给类初始化的,构造代码块是用来给对象初始化的
- 一个类中可以有多个静态代码块,前面定义的静态代码块先执行,后面定义的静态代码块后执行
- 静态代码块优先于main函数
四、Java中的初始化顺序
4.1 在一个类中的初始化顺序
- 静态代码块(只执行一次)
- 构造代码块
- 构造函数
public class A{
public A(){
//构造函数1
System.out.println("构造函数1");
}
public A(int t){
//构造函数2
System.out.println("构造函数2");
}
{
//构造代码块1
System.out.println("构造代码块1");
}
{
//构造代码块2
System.out.println("构造代码块2");
}
static{
//静态代码块1
System.out.println("静态代码块1");
}
static{
//静态代码块2
System.out.println("静态代码块2");
}
//程序入口
public static void main(String[] args) {
System.out.println("这里是main函数");
new A();
System.out.println("----------");
new A();
}
}
//执行结果
静态代码块1
静态代码块2
这里是main函数 //这里可以看出,静态代码块执行优先于main函数
构造代码块1
构造代码块2
构造函数1
----------
构造代码块1
构造代码块2
构造函数1
4.2 继承中的初始化顺序
- 执行父类的静态代码块
- 执行子类的静态代码块
- 执行父类的构造代码块,执行父类的构造函数
- 执行子类的构造代码块,执行子类的构造函数
public class A {
public static void main(String[] args) {
new B();
}
public A(){
//构造函数1
System.out.println("A构造函数1");
}
public A(int t){
//构造函数2
System.out.println("A构造函数2");
}
{
//构造代码块1
System.out.println("A构造代码块1");
}
{
//构造代码块2
System.out.println("A构造代码块2");
}
static{
//静态代码块1
System.out.println("A静态代码块1");
}
static{
//静态代码块2
System.out.println("A静态代码块2");
}
}
class B extends A{
public B(){
//构造函数1
System.out.println("B构造函数1");
}
public B(int t){
//构造函数2
System.out.println("B构造函数2");
}
{
//构造代码块1
System.out.println("B构造代码块1");
}
{
//构造代码块2
System.out.println("B构造代码块2");
}
static{
//静态代码块1
System.out.println("B静态代码块1");
}
static{
//静态代码块2
System.out.println("B静态代码块2");
}
}
//执行结果
A静态代码块1
A静态代码块2
B静态代码块1
B静态代码块2
A构造代码块1
A构造代码块2
A构造函数1
B构造代码块1
B构造代码块2
B构造函数1