類加載過程:
1, JVM會先去方法區中找有沒有相應類的.class存在。如果有,就直接使用;如果沒有,則把相關類的.class加載到方法區
2, 在.class加載到方法區時,會分為兩部分加載:先加載非靜態內容,再加載靜態內容
3, 加載非靜態內容:把.class中的所有非靜態內容加載到方法區下的非靜態區域內
4, 加載靜態內容:
4.1、把.class中的所有靜態內容加載到方法區下的靜態區域內
4.2、靜態內容加載完成之后,對所有的靜態變量進行默認初始化
4.3、所有的靜態變量默認初始化完成之后,再進行顯式初始化
4.4、執行靜態代碼塊(注:靜態代碼塊與靜態變量顯式初始化無先后順序,與代碼順序相關,如靜態代碼塊在上,則先加載代碼塊)
5,整個類的加載就完成了。
對象創建過程:
1, 在堆內存中開辟一塊空間
2, 給開辟空間分配一個地址
3, 把對象的所有非靜態成員加載到所開辟的空間下
4, 所有的非靜態成員加載完成之后,對所有非靜態成員變量進行默認初始化
5, 所有非靜態成員變量默認初始化完成之后,調用構造函數
6, 在構造函數入棧執行時,分為兩部分:先執行構造函數中的隱式三步,再執行構造函數中書寫的代碼
6.1、隱式三步:
1,執行super語句
2,對開辟空間下的所有非靜態成員變量進行顯式初始化
3,執行構造代碼塊(注:代碼塊與非靜態成員變量顯示初始化無先后順序,與代碼順序相關,如代碼塊在上,則先加載代碼塊)
6.2、在隱式三步執行完之后,執行構造函數中書寫的代碼
7,在整個構造函數執行完並彈棧后,把空間分配的地址賦值給一個引用對象
總結類中能書寫的成員
棧: 用來運行函數。可以存儲局部信息
特點:先進后出
堆:用來存儲實體(被new創建出來的)。
特點:
1, 每一個實體所開辟的空間都有一個地址
2, 每一個實體中存儲的數據都有一個默認初始值
方法區:存放class和static。 方法區其實是由N多個小的區域構成。有存放非靜態內容的非靜態區域,還有存放靜態內容的靜態區域,還有存放常量的常量池 等
class ABC
{
非靜態成員變量
靜態成員變量
非靜態成員函數
靜態成員函數
構造函數:ABC(...){...}
靜態代碼塊: static {...}
構造代碼塊 : {...}
}
圖解調用過程:
父子類加載及創建對象過程代碼實例:
-
//子類
-
public class Insect {
-
private int i = printInit("Insect:i");
-
protected int j;
-
-
protected static int x1 = printInit("static Insect.x1 initialized");
-
static{
-
System.out.println( "Insect靜態代碼塊");
-
x1= 80;
-
}
-
Insect() {
-
System.out.println( "基類構造函數階段: i = " + i + ", j = " + j);
-
j = 39;
-
System.out.println(x1);
-
}
-
-
static int printInit(String s) {
-
System.out.println(s);
-
return 47;
-
}
-
-
}
-
//父類
-
public class Beetle extends Insect{
-
{
-
k= 90;
-
}
-
private int k = printInit("Beetle.k initialized");
-
-
-
protected static int x2 = printInit("static Beetle.x2 initialized");
-
-
-
public Beetle() {
-
System.out.println(k);
-
}
-
-
-
public static void main(String[] args) {
-
Beetle b = new Beetle();
-
}
-
-
}
運行結果:
對象創建過程代碼和注釋:
- class Person {
- int age;
- Person(int age) {
- this.age = age;
- }
- }
- class Student extends Person {
- // 2,對開辟空間下的所有非靜態成員變量進行顯式初始化
- String school = "abc";
- Student(String school, int age) {
- // 1,執行super語句
- super(age);
- // 4、在隱式三步執行完之后,執行構造函數中書寫的代碼
- this.school = school;
- }
- {
- // 3,執行構造代碼塊
- System.out.println("Student code block");
- }
- }