【Java小知识】Java程序的初始化

【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修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值。

扫描二维码关注公众号,回复: 8495149 查看本文章

如果不在定义的时候或者构造函数中对final变量进行赋值的话,则生成的对象中final变量的值是未知的(编译器也会直接报错),因此必须进行初始化。
如果用static final同时修饰变量的话,则变量必须在定义的时候进行初始化。因为static变量属于类,在调用构造函数之前就已经被系统赋予默认值了。

总结:

类初始化顺序:静态变量大于非静态变量,父类大于子类
全局变量初始化可以不赋值,局部变量初始化必须赋值
final变量必须初始化

发布了18 篇原创文章 · 获赞 38 · 访问量 694

猜你喜欢

转载自blog.csdn.net/wudingmei1023/article/details/103812631
今日推荐