静态代码块:
-
在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。
-
静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。
-
每个静态代码块只会执行一次。如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
static {
System.out.println("静态初始化1");
id = 40;
Employee employee = new Employee("liuliu",50);
System.out.println(employee);
}
public static int id = 30;
{
System.out.println("初始化2");
name = "zhaosi";
age = 40;
}
static {
System.out.println("静态初始化2");
id=80;
}
构造代码块:
{ // 构造代码块
}
- 构造代码块的作用是给对象进行初始化。
- 对象一建立就运行构造代码块了,而且优先于构造函数执行。这里要强调一下,有对象建立,才会运行构造代码块,类不能调用构造代码块的,而且构造代码块与构造函数的执行顺序是前者先于后者执行。
- 构造代码块与构造函数的区别是:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。
{
System.out.println("初始化1");
name = "wangwu";
age = 20;
}
构造函数:
- 对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的。
- 构造函数的作用是用于给对象进行初始化。
- 一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次。
public Employee(String name,int age) {
super();
System.out.println("有参构造");
this.name = name;
this.age=age;
}
public Employee() {
super();
System.out.println("无参构造");
// TODO Auto-generated constructor stub
}
根据最终的结果说明:
执行顺序如下:
静态代码块(一次)
构造代码块(new几次就有几次)
构造函数(new几次就有几次)
普通代码块(每次调用方法都会调用)