初始化的方式
类能保证他的的每个基本类型的变量都会有一个初始值(值为0),而引用类型则会赋值为 null。除了默认初始化以为,还有以下几种初始化方式:
- 直接赋值
为变量赋值的值得最直接的方式就是在声明变量的时候为其赋值
public class Demo {
char c = 'c'; // 直接赋值
Object obj = new Object(); // 直接赋值
int a = func(); // 调用方法赋值
// 方法是可以带有参数的,但前提是这些参数已经被初始化过
private int func(){
return 10;
}
}
- 构造器初始化
使用构造器在运行时可以使用调用方法或执行某些行为来确定变量的初值。但在构造器初始化数据前,这些变量都会进行一次自动的初始化。
初始化的顺序
public class Demo {
int a = func();
private int func(){
return 10;
}
// 构造器初始化晚于直接赋值的方式
Demo(){
System.out.println(a);
a = 20;
}
public static void main(String[] args) {
Demo demo = new Demo();
System.out.println(demo.a);
}
}
10
20
静态数据的初始化
静态变量在初始化前,同样能保证每个基本类型的数据成员变量都会有一个初始值(值为0),而引用类型则会赋值为 null。
而静态数据的初始化会经过以下步骤:
- 当一个对象的静态域,静态方法和构造器被访问的,Java 解释器会查找类的路径,定位到
.class
文件,将其载入内存。 - 将 Class 对象载入内存,这时有关静态初始化的动作都会被执行。
- Java 允许将多个静态初始化动作组织成一个特殊的“静态块”,形如
static {...}
。而静态块的代码会在静态数据成员初始化后执行该代码。
最后总结下来执行的顺序如下:
静态域,静态方法和构造器被访问 -> 类载入内存 -> 静态成员初始化 -> 执行静态块内代码;
构造器虽然没有显示声明 static,但实际上也是一个静态方法。
代码实例如下:
public class Demo {
static Demo demo = new Demo("2");
public static void main(String[] args) {
Demo demo = new Demo("1");
}
}
public class Demo2 {
static Demo3 demo3 = new Demo3("1");
Demo2(String str){
System.out.println("demo2 " + str);
}
}
public class Demo3 {
Demo3(String str){
System.out.println("demo3 " + str);
}
static Demo demo = new Demo("3");
}
demo 3
demo3 1
demo2 1
demo 2
demo 1