1

java中所有变量在使用之前必须得到初始值,否则无法编译通过。java中的变量分为类中的成员变量和方法中的局部变量,方法中的局部变量在使用之前我们必须自己进行初始化。

一、成员变量的初始化:

1、成员变量的默认值:

Java会在调用构造方法之前对所有没有在声明时赋值的成员变量赋予默认值。

  • 数值类型:0
  • 字符char:'u0000'
  • 布尔型:false
  • 对象和数组:null
1、指定初始化值:

在声明成员变量的时候就指定初始化值。
在显示指定初始化值时若用的其他成员变量,必须保证用到的变量已经被初始化了。(成员变量的初始子上而下进行)

3、静态成员初始化:

静态成员变量的初始赋值与普通成员一样,唯一不同在于静态变量初始化只在在类加载时执行一次,而普通成员变量在每次实例化时都执行一次。

4、静态字句:
class Test {
    static int a = 1;
    static {
        System.out.println(a);
    }
    static int b = 2;
}

静态字句使用static后加大括号中,在类加载时静态字句会被执行,且之只会在类加载时执行一次。
注意:初始时,先对a进行初始,然后执行静态字句,然后对a进行初始化。如果上面输出得是b那将编译报错,因为我们不能再初始化直接使用一个变量。

5、非静态字句:
class Test {
    int a = 1;
    {
        System.out.println(a)
    }
}

非静态字句在每次实例化时被执行。

二、构造方法进行初始化:

每次创建类对象时都会调用类的构造方法,可以在构造方法中进行一些初始化操作,不过构造方法的调用发生在成员初始化之后。

1、this关键字调用其他构造方法

可以在构造方法将this作为方法调用从而调用其它构造方法,但this调用只能调用一次且必须在第一行。

public class Tree {
    private int h;
    
    public Tree() {
        this(6);
    }
    public Tree(int h) {
        this.h = h;    
    }
}

除构造方法中外,其他任何地方都禁止调用构造方法。

三、父类初始化:

类有父类时先对父类进行初始化,如果类类也有父类则对先初始化父类,以此进行下去。
并且在基类构造器第一个语句使用super调用父类的构造方法,若基类含有不带参数的构造方法那么可以不显示的调用super,编译器会自动调用。
super只能在构造方法第一行调用一次。

public class A {
    public A(int a) {
        
    }
}

public class B {
    public B(int b) {
        spuer(b);
    }
}

四、初始化顺序:

  1. 在类加载时唯一初始化一次次静态变量和执行静态字句。静态变量和静态执行子上而下顺序进行。
  2. 在每次实力化类对象时进行普通成员变量的初始化和执行费静态字句,初始化和字句按顺序自上而下执行。
  3. 有父类先进行父类的初始化

五、数组初始化

1、只声明时的默认值:
class Test {
    int[] as;
    
    public Test() {
        int[] bs;
    }
} 

Java中数组类型的变量也是对象,所以在成员变量的数组在声明后如果未初始化则有默认值null,但bs由于是方法里声明所以不会被自动初始化为null,在使用之前就需要手动显示的进行初始化。

2、new时的默认值:
class Test {
    public static void main(String[] args) {
        int[] aArr = new int[10];
        Integer[] bArrs = new Integer[10];
    }
}

对于aArr赋予new对象引用,此时aArr指向的是10个值为0的int数组。对于基本类型new的时候会为数组的每一个成员赋予默认值,如果是对象类型则赋予null:

  • 数值类型:0
  • 字符char:'u0000'
  • 布尔型:false
  • 对象:null

三江小渡
50 声望8 粉丝