1. 程式人生 > >java基礎之【繼承--->多型】記憶體圖

java基礎之【繼承--->多型】記憶體圖

<span style="font-size:14px;">1:Animal a = new Cat();
	1.1:在棧中建立區域,型別為Animal,變數名:a;
	1.2:在堆中new Cat();佔用一塊區域。地址值:[0x3a4]
	1.3:spuer()例項化父類Animal。
		1.3.1:new Animal();佔用一塊區域,地址值:0x3ab;
		1.3.2:引用著在方法區中初始化[Animal中的所有方法,該引用為:[0x754]]。
		1.3.3:將Animal()引用賦給spuer();spuer引用著Animal();
	1.4:在方法區中初始化Cat類的所有方法,引用值為0x343。
	1.5:將0x3a4賦給棧中的變數a;a就開始引用Cat()。
2:a.eat();
	2.1:通過[0x3a4]找到Cat。
	2.2:編譯時期:先spuer()找到Animal中的方法。如果沒有,則報錯。
	2.3:執行時:直接在Cat中找到eat(),當Cat中沒有,再去Animal中找。
	2.4:將eat()方法要方法區壓棧,執行,輸出:SOP(貓吃魚);
3:a = new Dog();
	3.1:在堆new Dog(),開闢一塊新區域,地址值:0x87xfds
	3.2:spuer();例項化父類Animal  
		3.2.1:new Animal()開闢新區域,地址值0x33fa;
		3.2.2:成員方法引用著方法區中已初始化的[0x754];
		3.2.3:將Animal地址值0x33fa賦給spuer();;spuer引用著Animal();
	3.3:在方法區中初始化Dog類的所有方法,引用值為0x422ac。
	3.4:將[0x87xfds]賦給棧中的變數a;  a不再引用Cat,而是引用著Dog;這時堆中的Cat已成為垃圾,等待JVM空閒時來回收。
4:a.eat();
	4.1:通過a變數引用值找到堆中標記為0x87xfds的區域。
	4.2:編譯時:先進super();去檢查Animal引用的方法區中有沒有eat()方法,如有沒有則報錯。
	4.3:執行時:直接去Doa方法區中找到eat();如果Doa沒有,再去執行super()呼叫父類的eat()方法。
	4.4:從方法區中將eat()壓棧,執行(SOP('狗吃糧'))。
5:a.shudy();
	5.1:通過a變數引用值找到堆中標記為0x87xfds的區域。
	5.2:編譯時:先進super();去檢查Animal引用的方法區中有沒有shudy()方法,結果Animal中沒有shudy()方法,所以就在編譯時期就報錯。
6:Dog d = (Dog)a;
	6.1:在棧中開闢區域,儲存型別為Dog,變數名d
	6.2:將a向下轉型,從Animal轉為Dog來引用Dog;(將a變數賦給d)
	6.3:a和d都指向堆中同一個Dog物件。
7:d.eat();//從Dog方法中壓棧執行eat()方法,然後彈棧;
8:d.shudy();//從Dog方法中壓棧執行shudy()方法,然後彈棧;
9:Cat c = (Cat) a;
	9.1:在棧中開闢一塊區域,儲存型別:Cat,變數名稱:c
	9.2:將a向下轉型,將Anmail引用Dao轉為Cat引用Dog;結果丟擲型別轉換異常。Dog不能被轉為Cat;</span>


相關推薦

java基礎繼承--->記憶體

<span style="font-size:14px;">1:Animal a = new Cat(); 1.1:在棧中建立區域,型別為Animal,變數名:a; 1.2:在堆中new Cat();佔用一塊區域。地址值:[0x3a4] 1.3:spuer()例項化父類Animal。 1

java基礎-單利模式/繼承/

單利模式:23種設計模式 單例類只能有一個例項。 單例類必須自己建立自己唯一的例項。 單例類必須給所有其他物件提供這個例項。 餓漢式單利模式 /* 餓漢式單利模式 */ class MySingleTon{ private stati

學習筆記 唐大仕—Java程式設計 第5講 深入理解Java語言5.2 及虛方法呼叫

/** * 多型及虛方法呼叫 * @author cnRicky * @date 2018.11.7 */ 多型 多型(Polymorphism)是指一個程式中相同的名字表示不同的含義的情況 多型有兩種情形 編譯時多型:  *過載(Overload)(多個同名的不同方法)  *如 p.sayH

面試題Java三大特性封裝繼承總結

本文內容總結於多篇部落格,參考到的地方在文中都會一一列出 http://www.cnblogs.com/ibalintha/p/3897821.html     1.封裝   封裝的定義: 首先是抽象,把事物抽象成一個類,其次才是封裝,

JAVA學習筆記-封裝,繼承, 總結

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------  1、封裝 封裝:把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。是軟體設計模組化、軟體複用和

java基礎堆、棧、方法區結構圖

|--陣列例項化過程 -----------------------------------------------------------------------------------------------------------------------------

java基礎數據類轉換

() ont plain data int java基礎 lai 之間 font 一 基礎類型互轉   1.String與其它基礎類型互轉(此處普通基礎類型及對應包裝類用type、Type代替)     a. 轉String:String. valueOf(基礎變量)

Java 基礎 數據類

存儲 TE 基本 java 基礎 sed 類型轉換 布爾 語言 整型 http://www.verejava.com/?id=1699255932129 /** java 分為4類8種基本數據類型 4類: 1. 整型(byte,short,int,long) 2. 浮點型(

java基礎 數據類

二進制 TE 默認值 pre 位數 常量 整型 它的 unicode 數據類型表示要存儲在變量中的不同類型的值。 一、Java語言提供了八種基本數據類型。六種數字類型(四個整數型,兩個浮點型),一種字符類型,還有一種布爾型。 1、 byte byte 數據類型是8

JAVA基礎(55)---經典案例

class A { private int a = 10; public String show(D obj) { // System.out.println(a); return ("A and D"); } publi

JAVA基礎(54)---

多型 所謂多型就是值程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中是實現的方法,必須在由程式執行期間才能確定。因為在程式執行時才確定具體的類,這

Python基礎字典&字串 (05)

字典   字典是另一種可變容器模型,且可儲存任意型別物件。 字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 info={"name":"w",      "age":

JAVA基礎集合、泛

今天我們來聊聊集合; 通常,我們的程式需要根據程式執行時才知道建立多少個物件。但若非程式執行,程式開發階段,我們根本不知道到底需要多少個數量的物件,甚至不知道它的準確型別。為了滿足這些常規的程式設計需要,我們要求能在任何時候,任何地點建立任意數量的物件,而這些物件用什麼來容納呢?我們首先

Java基礎十五 泛

第十五章 泛型 一般的類和方法,只能使用具體的型別:要麼是基本型別,要麼是自定義型別。如果要編寫可以應用於多種型別的程式碼,這種刻板的限制對程式碼的束縛就會很大。 在面對物件程式語言中,多型算是一種泛化機制。 泛型實現了引數化型別的概念,使程式碼可以應用於多種型別。 15.2 簡單泛型 創造容器類促進了泛型的

黑馬程式設計師----Java基礎面向物件(封裝 繼承 )(二)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎面向物件(封裝 繼承 )

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

Java基礎理解封裝,繼承,三大特性

目錄 封裝 繼承 多型 封裝 封裝隱藏了類的內部實現機制,可以在不影響使用的情況下改變類的內部結構,同時也保護了資料。對外界而已它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。 程式碼理解 public class Student { public Stud

Java基礎面向物件 介面

第11天面向物件 今日內容介紹  介面  多型 第1章 介面 1.1 介面概念 介面是功能的集合,同樣可看做是一種資料型別,是比抽象類更為抽象的”類”。 介面只描述所應該具備的方法,並沒有具體實現,具體的實現由介面的實現類(相當於介面的子類)來完成。這樣

JAVA基礎封裝、繼承

封裝、繼承、多型 1、封裝:隱藏實現細節,明確標識出允許外部使用的所有成員函式和資料項,從而防止程式碼或資料被破壞。 2、繼承:子類繼承父類,擁有父類的所有功能,並且可以在父類的基礎上進行擴充套件。實現了程式碼的重用性。子類和父類是相容的。 3、多型:一個介面有多個子類或實現類,

java基礎面向物件的三大特徵:封裝、繼承,學java必會!

java它是OOP語言(ObjectOrientedProgramming)面向物件程式語言,那麼什麼是物件?物件是什麼?毫無疑問這個問題有很多個答案,每個人對物件的理解是不一樣。 java面向物件的三大基本特徵之封裝: 我們為什麼要對我們的程式碼進行封裝?當我們定義一個人類的體重,要