java中三種初始化數據域的方法:
1、在構造器中設置值
public class Student{
private String name;
private int age;
public Student(){
this.name = "張梅";
this.age = 15;
}
}
2、在聲明中賦值
public class Student{
private String name = "張梅";
private int age = 15;
}
3、初始化塊
在一個類的聲明中,可以包含多個代碼塊,只要構造類的對象,這些塊就會被執行。
但是這種機制不是必須的,也不常見。通常會直接將初始化代碼放在構造器中。
舉例如下:
(1)創建包含初始化塊的類
package hhhh;
public class Employee3 {
static{
System.out.println("這是靜態初始化塊1");
Employee3 as = new Employee3();
}
private static int nextId = 90;
private int id;
private String name = "雪琪";
private double salary;
private static Employee3 as32 = new Employee3();
{
System.out.println("這是非靜態初始化塊" + nextId + "==name:" + name);
id = nextId;
nextId++;
}
static{
System.out.println("這是靜態初始化塊2" + nextId);
}
public Employee3(String n ,double s) {
name = n;
salary = s;
}
public Employee3() {
System.out.println("這是構造方法");
name = "";
salary = 0;
}
}
(2)創建測試類
package hhhh;
public class Test4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee3 a = new Employee3();
}
}
(3)查看運行結果
(4)結果分析
需要注意的是:
1、靜態初始化塊只執行一次
2、靜態初始化塊執行完後才執行非靜態初始化塊
3、非靜態初始化塊執行完後才執行構造方法
1) 當Test4類中實例化一個對象a之後就開始依次運行初始化塊。
所以先執行
得到第一條執行結果。
2)然後執行
因爲靜態初始化塊只執行一次,所以這裏得到結果
3)依次執行下面這兩條
首先得到了nextId=90,然後執行創建對象as32時又依次執行了非靜態方法和構造方法:
4)接下來執行靜態初始化塊2(因爲靜態初始化塊執行完才執行非靜態初始化塊)
得到結果:
5)這時,靜態初始化塊已經執行完了,該執行非靜態初始化塊了:
得到結果:
6)最終執行到1)的構造方法: