1. 程式人生 > >Java中子類物件初始化的過程

Java中子類物件初始化的過程

Java中的繼承機制看似簡單,實際上包含了很多細節。最近在刷題過程中屢屢跳坑,於是自己仔細再學習了一下Java中子類初始化的細節,與大家分享。

class Father
{   
    Father(){};
}
class Child extends Father
{
    super(); //隱式地呼叫父類建構函式,對父類進行初始化
    int age = 10; 
    Child(){};
}

以以上程式碼為例:

若執行Child child = new Child();

(1)首先對子類變數進行初始化(int age=0);

(2)執行子類Child建構函式中的隱式super(),呼叫父類建構函式對父類進行初始化;

(3)執行子類Child建構函式中的其餘部分,對子類進行初始化;

(4)對子類變數進行初始化(child.age = 10)

下面我們用一個例子,結合多型來詳細說明該初始化過程:

class Father
{
   Father()
   {
     	show();
   }
   void show()
   {
   		System.out.println("father");
   }
}

class Child extends Father
{
	int age = 9;
	Child()
	{
		//隱式super();
		System.out.println("child"+age);
	}
	void show()
	{
		System.out.println("show"+age);
	}
}

public class ChuShiHua
{
	public static void main(String[] args)
	{
		Father child = new Child();
	}
}

(1)執行Child child = new Child();時:首先預設初始化child.age = 0;(int類的預設初始化值為0)

(2)執行Child類的構造器,首先執行其中的隱式super(),於是執行父類Father的構造器,執行函式體中的show()’

(3)因為多型機制,子類中也有show(),所以執行子類中的show(),輸出show0

(4)父類初始化完畢,接著對子類中的變數賦值(child.age=9)

(5)接著執行子類構造器中的語句,輸出child9

所以最後的輸出是:

show0

child9

在分析此類問題時要特別注意子類在執行構造器時會先執行一個隱式的super()

這意味著子類呼叫構造器時要先執行父類的無引數構造器對父類進行初始化,如果父類沒有無參構造器,則會出現如下編譯錯誤:

相關推薦

Java中子物件初始過程

Java中的繼承機制看似簡單,實際上包含了很多細節。最近在刷題過程中屢屢跳坑,於是自己仔細再學習了一下Java中子類初始化的細節,與大家分享。 class Father { Father(){}; } class Child extends Father {

Java物件初始過程

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Java基礎26-物件初始過程

1 /* 2 1.因為new Test1()用到了Test1類,所以會把它從硬碟上載入進入記憶體 3 2.如果有static靜態程式碼塊就會隨著類的載入而執行,還有靜態成員和普通方法也會隨著類的載入而被載入 4 3.在堆中開闢空間,分配記憶體地址 5 4.在堆中建立物件特有屬性,並同時對特有屬

Java-9-內部類&初始過程

1.內部類訪問特點: 1.可以直接訪問外部類的私有成員. 2.外部類想要訪問內部類時,要在外面建立內部類的物件,進行呼叫. 1.2內部類什麼時候使用呢? 一般用於類的設計. 分析事物時,發現該事物描述中還有事物, 而且這個事物還在訪問被描述事物的內容,

Java學習筆記(註釋、物件初始過程、單例模式)

面向物件 9.幫助文件的製作 9.1註釋 - 原則: 1、註釋形式統一 在整個應用程式中,使用具有一致的標點和結構的樣式來構造註釋。如果在其它專案中發現它們的註釋規範與這份文件不同,按照這份規範寫程式碼,不要試圖在既成的規範系

java初始物件的例項區別

在程式RUN的一瞬間,什麼類啊,靜態的東西啊(靜態塊,靜態方法,靜態屬性),刷刷刷的就在記憶體中載入(你可以看作初始化)了,只加載一次,然後main方法開始執行(這就是為什麼main方法必須是靜態的原

java物件初始過程

假設有一下類: class Test{ int i; int j = 0; int count(){ return 0 }; Test() {} int n =0; } 我們知道,任何物件在使用前都會被初始化,方法裡

java基礎——初始

rmq ocs cin tp5 hmm wax fpm inf roo p滓D猩2賞40徽踴http://www.docin.com/app/user/userinfo?userid=178501575 薊逝猩鎂4韭v黴叭6http://huiyi.docin.com

Java-JVM 初始

() turn col factor div public .info ted pro public class Test { protected static final Logger logger = LoggerFactory.getLogger(Test.

C/C++程式設計教訓----函式內靜態物件初始非執行緒安全(C++11之前)

不少程式設計師在編寫程式的時候,會使用函式內靜態(static)變數,既能滿足函式內這個變數可以持久的記錄某些資訊,又使其訪問範圍的控制侷限於函式內。但函式內靜態類物件初始化是非執行緒安全的。 問題背景 在我們產品中對log4cxx做了一些簡單的封裝 (採用VS2005編譯),其中會

java初始操作

java中一個類如果想要初始化,是如何進行的呢?砍了程式設計思想,也結合了網上其他人的文章,最終有了一個新的認識。 一、初始化順序     Java中類初始化順序:(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。 其中小括號內部之間的呼叫順序是

物件例項過程

2018年11月05日 08:58:03 aprildusk 閱讀數:3 個人分類: java

java泛型物件初始--java泛型物件能例項嗎T t=new T()

java中沒法得到泛型引數化型別,因為在編譯期沒法確定泛型引數化型別,也就找不到對應的類位元組碼檔案,自然就不行了  泛型反射的關鍵是獲取ParameterizedType,再呼叫它的getAct

mybatis原始碼學習——Configuration及其初始過程、TypeHandler、TypeAlias

Configuration類是Mybatis中的特別核心的一個類,主要用來進行Mybatis執行過程中的各項引數的設定。第一次Debug原始碼時,會感覺到什麼配置都需要在Configuration中設定,多次Debug之後,發現確實如此,這就是Mybatis中的

c++物件初始方式總結

在《inside the c++ object model》一書中談到copy constructor的構造操作,有三種情況下,會以一個object的內容作為另一個object的初值: 第一種情況: XX aa = a; 第二種情況: XX aa(a); 第三種情況: ex

物件初始過程與單例設計模式(餓漢式與懶漢式)

1.物件初始化過程:(先載入類到記憶體,然後載入類屬性,成員方法) 定義一個類Person,  在new Person("zhangsan",20); 初始化過程: 1.因為new 用到Person

多執行緒下初始過程

本文對Java多執行緒情況下類初始化過程中做一個總結說明:Java語言規範規定,對於每一個類或者介面,都有一個唯一的初始化鎖與之對應總結為4個階段一、獲取Class物件的初始化鎖    獲取Class物件的初始化鎖來控制類或者介面的初始化過程,這個鎖是執行緒阻塞的(即A獲取了

初始物件初始

類的生命週期: 載入——> 驗證、準備、解析——>初始化——>使用——>解除安裝 類初始化進行的5種情況: 1.遇到new、getstatic、putstatic或invokestatic這4條位元組碼指令時,如果類沒有進行過初始化,則需要先觸發其初

深入理解Java物件的建立過程初始與例項

摘要:   在Java中,一個物件在可以被使用之前必須要被正確地初始化,這一點是Java規範規定的。在例項化一個物件時,JVM首先會檢查相關型別是否已經載入並初始化,如果沒有,則JVM立即進行載入並呼叫類構造器完成類的初始化。在類初始化過程中或初始化完畢後,根據具體情況才會

-1-2 java 面向物件基本概念 封裝繼承多型 變數 this super static 靜態變數 匿名物件 值傳遞 初始化過程 程式碼塊 final關鍵字 抽象 介面 區別 多型 包 訪問許可權 內部類 匿名內部類 == 與 equal

java是純粹的面向物件的語言 也就是萬事萬物皆是物件 程式是物件的集合,他們通過傳送訊息來相互通訊 每個物件都有自己的由其他的物件所構建的儲存,也就是物件可以包含物件 每個物件都有它的型別  也就是類 某一特定型別的所有物件都可以接收相同的訊息,因為同一類事物有共同的特性 面向物件開發 •