java類加載、對象創建過程


類加載過程:

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 {...}

構造代碼塊 :  {...}

}

 

 圖解調用過程:

  

父子類加載及創建對象過程代碼實例:

  1. //子類
  2. public class Insect {
  3. private int i = printInit("Insect:i");
  4. protected int j;
  5.  
  6. protected static int x1 = printInit("static Insect.x1 initialized");
  7. static{
  8. System.out.println( "Insect靜態代碼塊");
  9. x1= 80;
  10. }
  11. Insect() {
  12. System.out.println( "基類構造函數階段: i = " + i + ", j = " + j);
  13. j = 39;
  14. System.out.println(x1);
  15. }
  16.  
  17. static int printInit(String s) {
  18. System.out.println(s);
  19. return 47;
  20. }
  21.  
  22. }
  23. //父類
  24. public class Beetle extends Insect{
  25. {
  26. k= 90;
  27. }
  28. private int k = printInit("Beetle.k initialized");
  29.  
  30.  
  31. protected static int x2 = printInit("static Beetle.x2 initialized");
  32.  
  33.  
  34. public Beetle() {
  35. System.out.println(k);
  36. }
  37.  
  38.  
  39. public static void main(String[] args) {
  40. Beetle b = new Beetle();
  41. }
  42.  
  43. }

運行結果:

對象創建過程代碼和注釋:

[java]  view plain  copy
  1. class Person {  
  2.     int age;  
  3.   
  4.     Person(int age) {  
  5.         this.age = age;  
  6.     }  
  7. }  
  8.   
  9. class Student extends Person {  
  10.     // 2,對開辟空間下的所有非靜態成員變量進行顯式初始化  
  11.     String school = "abc";  
  12.   
  13.     Student(String school, int age) {  
  14.         // 1,執行super語句  
  15.         super(age);  
  16.         // 4、在隱式三步執行完之后,執行構造函數中書寫的代碼  
  17.         this.school = school;  
  18.     }  
  19.   
  20.     {  
  21.         // 3,執行構造代碼塊  
  22.         System.out.println("Student code block");  
  23.     }  
  24. }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM