1. 程式人生 > >java中的方法之new一個物件的時候JVM都做了那些事情

java中的方法之new一個物件的時候JVM都做了那些事情

——之前沒有進行類載入

   *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
結論:  子類中的屬性的顯示賦值的時機 是在 父類構造器執行完之後和子類的匿名程式碼塊執行之前的某個時候