java類加載、對象建立過程

類加載過程:html

1, JVM會先去方法區中找有沒有相應類的.class存在。若是有,就直接使用;若是沒有,則把相關類的.class加載到方法區java

2, 在.class加載到方法區時,會分爲兩部分加載:先加載非靜態內容,再加載靜態內容ide

3, 加載非靜態內容:把.class中的全部非靜態內容加載到方法區下的非靜態區域內函數

4, 加載靜態內容:this

    4.一、把.class中的全部靜態內容加載到方法區下的靜態區域內url

    4.二、靜態內容加載完成以後,對全部的靜態變量進行默認初始化spa

    4.三、全部的靜態變量默認初始化完成以後,再進行顯式初始化code

    4.四、執行靜態代碼塊(注:靜態代碼塊與靜態變量顯式初始化無前後順序,與代碼順序相關,如靜態代碼塊在上,則先加載代碼塊)orm

5,整個類的加載就完成了。htm

 

對象建立過程:

1, 在堆內存中開闢一塊空間

2, 給開闢空間分配一個地址

3, 把對象的全部非靜態成員加載到所開闢的空間下

4, 全部的非靜態成員加載完成以後,對全部非靜態成員變量進行默認初始化

5, 全部非靜態成員變量默認初始化完成以後,調用構造函數

6, 在構造函數入棧執行時,分爲兩部分:先執行構造函數中的隱式三步,再執行構造函數中書寫的代碼

    6.一、隱式三步:

        1,執行super語句

        2,對開闢空間下的全部非靜態成員變量進行顯式初始化

        3,執行構造代碼塊(注:代碼塊與非靜態成員變量顯示初始化無前後順序,與代碼順序相關,如代碼塊在上,則先加載代碼塊)

    6.二、在隱式三步執行完以後,執行構造函數中書寫的代碼

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.         // 四、在隱式三步執行完以後,執行構造函數中書寫的代碼  
  17.         this.school = school;  
  18.     }  
  19.   
  20.     {  
  21.         // 3,執行構造代碼塊  
  22.         System.out.println("Student code block");  
  23.     }  
  24. }
相關文章
相關標籤/搜索