欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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.按照成员变量的定义顺序进行初始化

所以初始化流程如下:

  1. 父类静态变量
  2. 父类静态代码块
  3. 子类静态变量
  4. 子类静态代码块
  5. 父类非静态变量
  6. 父类非静态代码块
  7. 父类构造函数
  8. 子类非静态变量
  9. 子类非静态代码块
  10. 子类构造函数

成员变量的初始化

全局变量的初始化:

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变量必须初始化

相关标签: Java小知识 java