天天看點

java初始化new_new一個對象的初始化過程

雲原生靈活運維從入門到精通it服務

69元

包郵

(需用券)

去購買 >

java初始化new_new一個對象的初始化過程

###############################

今天總結一下,new對象的初始化過程。

###############################

首先,當不含static成員時,先看一下案例圖:

java初始化new_new一個對象的初始化過程

如圖所示,我們先定義相關類,Building,House(繼承Building),Villa(繼承House),同時,House有成員變量LivingRoom,LivingRoom有成員變量Bed和Desk。

具體代碼實作如下:

1 //建築

2 classBuilding {3 publicBuilding() {4 System.out.println("Building");5 }6 }7 //房子

8 class House extendsBuilding{9 public LivingRoom livingRoom = new LivingRoom();//卧室

10 publicHouse() {11 System.out.println("House");12 }13 }14 //别墅

15 class Villa extendsHouse{16 publicVilla () {17 System.out.println("Villa");18 }19 }20 //卧室

21 classLivingRoom {22 public Bed bedFirst = new Bed();//床

23 public Desk deskFirst = new Desk();//桌子

24

25 publicLivingRoom () {26 System.out.println("LivingRoom");27 }28 }29 //床

30 classBed {31 publicBed () {32 System.out.println("Bed");33 }34 }35 //桌子

36 classDesk {37 publicDesk () {38 System.out.println("Desk");39 }40 }41 此時,我們new Villa():42 public classInitializeDemo {43 @Test44 public voidtestInitialize() {45 Villa villa = newVilla();46 }47 }48 執行結果為:49 Building50 Bed51 Desk52 LivingRoom53 House54 Villa

在此案例中,我們在建立Villa對象時,會先試着建立Villa的父類House的對象,但House也有父類Building,Building還有父類object。是以,實際上,本類會先建立object對象并初始化,在object對象建立并初始化後,會建立building對象,building對象沒有成員變量,是以直接執行構造器,列印出building。

接着,開始建立house對象,house對象有成員變量livingRoom,是以,會先初始化livingRoom,建立livingRoom時,也會先建立livingRoom的父類object對象并初始化沒其次再建立livingRoom執行個體,livingroom同樣有兩個成員變量bed和desk,因而會按兩個成員變量的定義順序,先後建立bed和desk。初始化成員變量成功後,執行livingroom的構造器,列印livingroom。初始化livingroom成功後,開始執行house的構造器,列印house。

最後,在house初始化成功後,執行了Villa的構造器,列印出Villa。

初始化成功。

其次,當有static成員時

1 classFamily {2 Family (Class className) {3 System.out.println("建立Family對象");4 System.out.println(className.getName());5 }6 }7 classPerson {8 Person() {9 System.out.println("建立Person對象");10 }11 public static Family family = new Family(Person.class);12 static{13 System.out.println("執行Person靜态代碼塊");14 }15 {16 System.out.println("執行Person代碼塊");17 }18 }19 public class Student extendsPerson {20 publicStudent() {21 System.out.println("建立student對象");22 }23 {24 System.out.println("執行Student代碼塊");25 }26 static{27 System.out.println("執行Student靜态代碼塊");28 }29 public static Family staticFamily = new Family(Student.class);30 @Test31 public voidtest() {32 System.out.println("=============");33 }34 public Family family = new Family(Student.class);35 }36 執行結果:37 建立Family對象38 com.tca.thinkInJava.chap7.Person39 執行Person靜态代碼塊40 執行Student靜态代碼塊41 建立Family對象42 com.tca.thinkInJava.chap7.Student43 執行Person代碼塊44 建立Person對象45 執行Student代碼塊46 建立Family對象47 com.tca.thinkInJava.chap7.Student48 建立student對象

1.首先在執行@test方法時,必須建立student的執行個體對象。

2.要建立student的執行個體對象,第一步先加載student父類person和student類的位元組碼,并對相關靜态成員變量進行初始化,執行靜态代碼塊。

3.首先加載父類person位元組碼,靜态成員變量public static family ,family優于靜态代碼塊前聲明,是以先對靜态成員變量family進行初始化。建立family對象,列印“建立family對象”,“xxxxxx”。

4.加載完person位元組碼後,再加載student位元組碼。靜态代碼塊再靜态成員public static family staticfamily之前聲明,是以先執行靜态代碼塊,列印“執行student靜态代碼塊”,在進行成員變量初始化,執行“建立family對象”,“xxxxxxxxxx”。

5.建立student父類person的執行個體對象,建立執行個體對象時,先進行非靜态成員變量初始化和代碼塊的執行,在執行構造器方法。是以先列印“執行person代碼塊”,再列印“建立person對象”。父類對象建立和初始化完畢。

6.建立子類對象student,先進行非靜态成員變量初始化和代碼塊的執行,在執行構造方法。代碼塊的聲明再非靜态成員變量聲明之前,是以先執行代碼塊,列印“執行student代碼塊”,再對family進行初始化,建立family對象,列印“建立family對象”,“xxxxxxxxxxx”。

7.執行test測試方法。

總結:

當不含static成員時,我們new一個對象A時,首先會先建立A類的父類B的執行個體對象,如果B類仍有C類,會先建立父類C的對象,以此類推,是一個遞歸建立的過程;當該類的父類對象已經全部建立并初始化時,會對該類進行建立和初始化。但在對該類進行初始化時,會先初始該類對象的成員變量,再執行該類的構造方法。成員變量的初始化和代碼塊的執行順序,由它們聲明順序決定的,按順序依次初始化或執行,但均在構造器方法之前執行。

當有static成員時,在該類第一次被JVM加載時,靜态成員變量隻會被初始化一次,靜态代碼塊隻會被執行一次。會先加載父類位元組碼,再加載子類位元組碼,如果有建立某類的執行個體對象,也是在該類的父類和該類的位元組碼加載完成之後,才會執行個體化該類父類的執行個體對象和該類的執行個體對象。靜态成員變量的初始化和靜态代碼塊的執行順序,是由它們的聲明順序決定的,按順序依次初始化或執行。

原文連結:https://www.cnblogs.com/HuiH/p/11670852.html

java 11官方入門(第8版)教材

79.84元

包郵

(需用券)

去購買 >

java初始化new_new一個對象的初始化過程