學習Java的同學注意了!!!
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990 我們1起學Java!
昨天看了1本叫做《突破程序員基本功的16課》的書,個人感覺還可以,主要對Java的技能進行了1些深入的講授,讓我對類的初始化和對象的創建有了新的認識。
1、類的初始化
對類的初始化:類的初始化1般只初始化1次,類的初始化主要是初始化靜態成員變量。
類的編譯決定了類的初始化進程。
編譯器生成的class文件主要對定義在源文件中的類進行了以下的更改:
1) 先依照靜態成員變量的定義順序在類內部聲明成員變量。
2) 再依照原java類中對成員變量的初始化順序進行初始化。
1個java類和編譯后的class對應的轉換以下:
源文件:
public class Person{
public static String name="張3";
public static int age;
static{
age=20;
System.out.println("初始化age");
}
public static String address;
static{
address="北京市";
age=34;
}
public static void main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}
當java源代碼轉換成1個class文件后,其轉換成類似下面的代碼:
public class Person{
public static String name;
public static int age;
public static String address;
static{
name="張3";
age=20;
System.out.println("初始化age");
address="北京市";
age=34;
}
public static void main(String[] args) {
System.out.println(name);
System.out.println(age);
System.out.println(address);
}
}
初始化順序根據轉換后對應的class類成員變量的初始化順序順次履行,所以所有的靜態成員變量都是先聲明,后履行賦值的,而且賦值的順序也是依照源代碼對靜態成員變量初始化的順序進行的,注意:定義1個成員變量并直接初始化與在靜態代碼塊中進行初始化是等價的,都是根據它們在源代碼中定義的順序進行的。
2、對象的生成
對對象的生成其初始化進程與類的初始化進程類似,但會增加構造函數階段,源代碼以下:
1 public class Person{
2 {
3 name="李4";
4 age=56;
5 System.out.println("初始化age");
6 address="上海";
7 }
8 public String name="張3";
9 public int age=29;
10 public String address="北京市";
11 public Person(){
12 name="趙6";
13 age=23;
14 address="上海市";
15 }
16 }
編譯器轉換成class文件后,會轉換成類似下面的代碼:
1 public class Person{
2 public String name;
3 public int age;
4 public String address;
5 public Person(){
6 name="李4";
7 age=56;
8 System.out.println("初始化age");
9 address="上海";
10 name="張3";
11 age=29;
12 address="北京市";
13 name="趙6";
14 age=23;
15 address="上海市";
16 }
17 }
可以看到,對類中對成員變量的初始化和代碼塊中的代碼全部都挪到了構造函數中,并且是依照java源文件的初始化順序順次對成員變量進行初始化的,而原構造函數中的代碼則移到了構造函數的最后履行。本人之前1直對類初始化進程1直沒有1個深入的理解,就是弄不清究竟是怎樣初始化的,只能依照書上所說的記住了初始化順序,但是過1段時間有給忘了,所以這次總算給弄清楚了,還是依照1個模型來解釋初始化機制比較好啊,不用再背了,只有理解了才能不容易忘。
學習Java的同學注意了!!!
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990 我們1起學Java!