【Java小知识】Java程序的初始化
程序员文章站
2024-01-09 23:51:52
...
【Java小知识】Java程序的初始化
Java在实例化一个对象之前,必须先对所在类的所有成员变量进行初始化,成员变量初始化完成之后,才会调用构造函数创建对象。
初始化顺序
那么具体的初始化顺序是神马样呢,下面通过一个简单的代码look一下。
public class Base {
static {
System.out.println("Base static block");
}
{
System.out.println("Base block");
}
public Base(){
System.out.println("Base constructor");
}
}
public class Cat extends Base {
static {
System.out.println("Cat static block");
}
{
System.out.println("Cat block");
}
public Cat(){
System.out.println("Cat constructor");
}
public static void main(String[] args) {
new Cat();
}
}
我们看下结果:
Base static block
Cat static block
Base block
Base constructor
Cat block
Cat constructor
如上图:父类静态代码块->子类静态代码块->父类非静态代码块->父类构造函数->子类非静态代码块->子类构造函数。
Java初始化遵循3个原则:
1.静态变量优先于非静态变量,静态变量只初始化一次,而非静态变量可能会初始化多次;
2.父类优先于子类进行初始化;
3.按照成员变量的定义顺序进行初始化;
所以初始化流程如下:
- 父类静态变量
- 父类静态代码块
- 子类静态变量
- 子类静态代码块
- 父类非静态变量
- 父类非静态代码块
- 父类构造函数
- 子类非静态变量
- 子类非静态代码块
- 子类构造函数
成员变量的初始化
全局变量的初始化:
public class B {
private static int a;
private static double b;
private static char c;
private static String d;
private static Cat cat;
public static void main(String[] args) {
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(cat);
}
}
0
0.0
null
null
全局变量初始化可以不赋值,有默认值,基本数据类型int.byte.short.long默认值为0,float.double为0.0,char为一个空格,对象为null。
注意:final变量初始化必须赋值。
那么局部变量的初始化呢?
public class A {
public static void main(String[] args) {
int a; //没有进行初始化
System.out.println(a);
}
}
Error:(6, 28) java: 可能尚未初始化变量a
编译错误,局部变量定义后,必须初始化赋值,才能使用(没有默认值)。
final变量初始化
final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值。
如果不在定义的时候或者构造函数中对final变量进行赋值的话,则生成的对象中final变量的值是未知的(编译器也会直接报错),因此必须进行初始化。
如果用static final同时修饰变量的话,则变量必须在定义的时候进行初始化。因为static变量属于类,在调用构造函数之前就已经被系统赋予默认值了。
总结:
类初始化顺序:静态变量大于非静态变量,父类大于子类
全局变量初始化可以不赋值,局部变量初始化必须赋值
final变量必须初始化
上一篇: 认知计算:当计算机变成人脑