java中的方法之new一個物件的時候JVM都做了那些事情
阿新 • • 發佈:2019-01-27
——之前沒有進行類載入
*1.類載入,同時初始化類中靜態的屬性(賦預設值,隨即賦宣告的值),
* 2.執行靜態程式碼塊
3. 為類分配記憶體空間,初始化非靜態的屬性 (賦預設值)
4.呼叫父類構造器
5.父類構造器執行完後,如果自己宣告屬性的同時有顯示的賦值,那麼進行顯示賦值把預設值覆蓋
6.執行匿名程式碼塊
7.執行構造器
8.返回記憶體地址
——之前已經進行了類載入
1.分配記憶體空間,同時初始化非靜態的屬性(賦預設值)
2.呼叫父類構造器
3.父類構造器執行完後,如果自己宣告屬性的同時有顯示的賦值,那麼進行顯示賦值把預設值覆蓋
4.執行匿名程式碼塊
5.執行構造器
6.返回記憶體地址
例子: package com.test; public class Test { public static void main(String[] args) { A a = new B(); } } class A{ protected String name = "lisi"; public A() { System.out.println("父類構造器A"); System.out.println("父類構造器A中呼叫test方法開始,由於子類重寫過test方法所以這裡執行子類的test方法"); test(); System.out.println("父類構造器A中呼叫test方法結束"); } public void test(){ } } class B extends A{ private String name = "tom"; { System.out.println("子類匿名程式碼塊中:"+name); } public B() { System.out.println("子類構造器B"); } public void test(){ System.out.println("test方法中:this.name="+this.name); System.out.println("test方法中:super.name="+super.name); } } 列印結果: 父類構造器A //子類構造器呼叫父類構造器 父類構造器A中呼叫test方法開始,由於子類重寫過test方法所以這裡執行子類的test方法 test方法中:this.name=null //這個時候父類構造器還沒有執行完 所以子類中的屬性不會顯示賦值 所以只有初始的預設值null test方法中:super.name=lisi //這個時候父類構造器開始呼叫 了 所以父類中的屬性已經有了顯示賦的值了 父類構造器A中呼叫test方法結束 子類匿名程式碼塊中:tom //這個時候父類構造器已經呼叫結束 所以子類中的屬性已經有了顯示賦的值了 子類構造器B 結論: 子類中的屬性的顯示賦值的時機 是在 父類構造器執行完之後和子類的匿名程式碼塊執行之前的某個時候