導航:首頁 > 編程語言 > java繼承內存

java繼承內存

發布時間:2022-08-26 17:42:13

java繼承中子父類的關系及內存結構是怎樣的,父類中this表示子類對象,this.屬性怎麼表示父類的屬性

因為子類的方法覆蓋了父類的了,就是說我繼承了你的,但是先你的不好,改了,所以用子類的

⑵ java在創建繼承的類的對象時 內存到底是什麼樣子

如果在創建類的時候沒有聲明要繼承的類 那麼java就默認 把它繼承Object類
public class A{
/*Code*/
}

public class A extends java.lang.Object{
/*Code*/
}
以上兩種的等價的public class Test // 從Object類繼承
{
public static void main(String[] args)
{
System.out.println(new Test().toString());
}
}
從上面的代碼可以看出,實際上,Test類的父類就是Object,因此,在Test中可以使用Object類的public或protected資源,如toString方法。那麼Java編譯器和JVM到底是如何做的呢?
了解這個原因其實並不需要知道JVM的實現細節。只要思考一下對於這種虛擬機程序的原理即可。一般對於這種靠虛擬機運行的語言(如Java、C#等)會有兩種方法處理默認繼承問題。
1、在編譯源代碼時,當遇到沒有父類的類時,編譯器會將其指定一個默認的父類(一般為Object),而虛擬機在處理到這個類時,由於這個類已經有一個默認的父類了,因此,VM仍然會按著常規的方法來處理每一個類。對於這種情況,從編譯後的二進制角度來看,所有的類都會有一個父類。
2、編譯器仍然按著實際代碼進行編譯,並不會做額外的處理。如果一個類沒有顯式地繼承於其他的類,編譯後的代碼仍然沒有父類。然後由虛擬機運行二進制代碼時,當遇到沒有父類的類時,就會自動將這個類看成是Object類的子類(一般這類語言的默認父類都是Object)。
從上面兩種情況可以看出,第1種情況是在編譯器上做的文章,也就是說,當沒有父類時,由編譯器在編譯時自動為其指定一個父類。第2種情況是在虛擬機上做文章,也就是這個默認的父類是由虛擬機來添加的。那麼Java是屬性哪一種情況呢?其實這個答案很好得出。只需要隨便找一個反編譯工具,並.class文件進行反編譯即可得知編譯器是如何編譯的。就以上面代碼為例,如果是第1種情況,就算Test沒有父類,但由於編譯器已經為Test自動添加了一個Object父類,因此,在反編譯後得到的源代碼中的Test類是從Object類繼承的。如果沒是這種情況,那麼就是第2種情況。

⑶ java中的類不繼承Serialiable,進行內存管理,會不會出問題

這個有時候會出問題的,比如啟動有時就會報出錯誤,所以最好還是加上!只是一個實現序列化

⑷ java課程分享Java內存模型原理

這篇文章主要介紹模型產生的問題背景,解決的問題,處理思路,相關實現規則,環環相扣,希望讀者看完這篇文章後能對 Java 內存模型體系產生一個相對清晰的理解,知其然知其所以然。

內存模型產生背景

在介紹 Java 內存模型之前,java課程http://www.kmbdqn.com/認為應該先了解一下物理計算機中的並發問題,理解這些問題可以搞清楚內存模型產生的背景。

物理機遇到的並發問題與虛擬機中的情況有不少相似之處,物理機的解決方案對虛擬機的實現有相當的參考意義。

物理機的並發問題

硬體的效率問題

計算機處理器處理絕大多數運行任務都不可能只靠處理器「計算」就能完成,處理器至少需要與內存交互,如讀取運算數據、存儲運算結果,這個 I/O 操作很難消除(無法僅靠寄存器完成所有運算任務)。

由於計算機的存儲設備與處理器的運算速度有幾個數量級的差距,為了避免處理器等待緩慢的內存完成讀寫操作,現代計算機系統通過加入一層讀寫速度盡可能接近處理器運算速度的高速緩存。

緩存作為內存和處理器之間的緩沖:將運算需要使用到的數據復制到緩存中,讓運算能快速運行,當運算結束後再從緩存同步回內存之中。

緩存一致性問題

基於高速緩存的存儲系統交互很好的解決了處理器與內存速度的矛盾,但是也為計算機系統帶來更高的復雜度,因為引入了一個新問題:緩存一致性。

在多處理器的系統中(或者單處理器多核的系統),每個處理器(每個核)都有自己的高速緩存,而它們有共享同一主內存(Main Memory)。

當多個處理器的運算任務都涉及同一塊主內存區域時,將可能導致各自的緩存數據不一致。

為此,需要各個處理器訪問緩存時都遵循一些協議,在讀寫時要根據協議進行操作,來維護緩存的一致性。


⑸ java繼承類的內存關系

這個問題你可以通過javap命令反編譯發現,在child對象所佔的內存中存放的是實際的變數而非

對parent對象的引用。

⑹ java 中子類繼承父類的欄位時,佔用的是同一塊內存還是父類和子類對象分別佔用各自的一塊內存,請高人詳答

java語言中的對象採用的堆和棧的形式來存放,例如 Father f = new Father();f存放在棧中,其實只是一個堆內存的地址,真正地對象保存在此地址所指向的堆內存中。
所以你的答案就顯而易見了,Father f = new Father(); Child c = new Child();這里Father是父類,Child是子類,f和c是兩個不同的內存地址,他們的對象保存的地方也不同,所以他們的欄位也不會再同一片內存區域。
如果父類中有個欄位a,子類繼承了父類的這個欄位a,其實就是子類的那個內存區域裡面也會有一個a欄位,父類的內存區域中也有a欄位,他們兩個沒有什麼關系。

⑺ java中子類對象和父類對象的內存模型圖

左邊是棧空間,右邊是堆空間,棧空間的變數t儲存著一個指向堆空間某個對象的地址

⑻ java 繼承問題 public class Z extens X{ Y y=new Y

隨手寫的代碼吧,關鍵字也能錯。
我覺得你的問題應該是問java類初始化的執行順序。

java類初始化的順序是:
1.靜態屬性
2.靜態自由塊
3.屬性
4.自由塊
6.構造方法
再加上繼承關系,初始化的順序是:
1.父類:靜態屬性
2.父類:靜態自由塊
3.子類:靜態屬性
4.子類:靜態自由塊
5.父類:屬性
6.父類:自由塊
7.父類:構造方法
8.子類:屬性
9.子類:自由塊
10.子類:構造方法

⑼ 為什麼Java類只能繼承一個父類

有取必有舍。Java認為多重繼承不是一個很重要並且不是沒有就不行的特性,但是他帶來的危害卻大於他的好處,所以舍棄。同理對於指針、內存管理都一樣道理。
我同意有些人的回答說Java不信任程序員。正因如此,所以Java沒有指針、不需要內存管理、也沒有多重繼承。但是,程序員可以說是最不值得信任的一群群體,不然為何需要專門的測試人員?所有語言都在一定程度不信任程序員,只是看程度如何而已。如果信任程序員的能力,應該去使用匯編語言、如果信任程序員的能力和水平,應該讓程序員自己查BUG測試。
Java相比C++選擇對程序員的給予更低信任度而換取更高的代碼安全性。即Java選擇了舍棄更多的功能或性能而選擇更高的保險性罷了。
---------------------------用Java實現多重繼承的方式-----------------------------
而對於多重繼承的實現方式。其實並不應該像很多人說的那樣使用實現多個介面實現的。如果這樣,將產生大量的「CTRL C+CTRL V」,當你發現你大量的CTRL C+CTRL+V時,就幾乎可以斷定。你的代碼寫得不好了。
「實現上的繼承就跟過度使用goto語句一樣,使程序擰巴和脆弱。結果就是,面向對象系統通常遭受復雜和缺乏復用的痛苦。」— John Ousterhout( Tcl and Tk 的創始人) Scripting, IEEE Computer, March 1998「面向對象編程語言的問題在於,它總是附帶著所有它需要的隱含環境。你想要一個香蕉,但得到的卻是一個大猩猩拿著香蕉,而其還有整個叢林。」— Joe Armstrong(Erlang語言發明人)以下就以大猩猩的例子舉例實現多重繼承。現有抽象對象猩猩和對象大猩猩、拿著香蕉的大猩猩、拿著蘋果的大猩猩、拿著香蕉和蘋果的大猩猩,四個對象。繼承關系圖如下:(word作圖,某些箭頭不規范,請見諒)
並且再考慮有一個人類的類。裡面有一個方法:「喂猩猩」,參數是「猩猩」類型。註:猩猩是抽象類。
Version 1 --------使用組合+繼承
這樣,既實現了多繼承、也實現了多態——無論是大猩猩,還是拿著香蕉和蘋果的大猩猩都能傳遞參數給人類的「喂猩猩的方法」了。
但這樣還有一個問題,假如我還需要在大猩猩的層面擴充繼承的更多數量的類如繼承「野生動物」。而在人類的方法新增遠離野生動物的方法:
Version2----------介面+組合
這就是我們說的用介面實現多重繼承。是因為這樣可以把子類利用多態賦給多個父類(介面),而把主要的方法使用組合封裝起來而避免多次實現介面的方法。需要多少鍾父類型,就在頂層增加介面實現。註:本初的猩猩類依舊可以設計為「類」即最頂層可以考慮擁有一個(抽象)類,也可以全部都是設計為介面,具體看業務需求和復雜度而定。
以上是參加完Oracle 新員工培訓後所思所得,有錯請評論指出。

⑽ 謝謝大蝦指點,,java中繼承的子類中能重寫父類中的構造方法嗎求舉例子並畫出內存分析圖。。十分感謝

這個是絕對不可能的。

構造子類的時候,首先調用的是父類的構造。所以重寫是不可能的。

但是有一個偏門可以走。

譬如
public class A {
protected int name ;
public A(){
this.name = "Parent";
}}

public class B extends A{

public B(){
super();
super.name = "Son";//不能實現重寫,但是可以把父類構造函數裡面的語句在這里重新構造從//而實現重寫
xxxxxx//子類方法
}

}

閱讀全文

與java繼承內存相關的資料

熱點內容
阿里雲伺服器終端在哪裡 瀏覽:144
app紙有什麼用 瀏覽:219
cuteftp命令 瀏覽:502
最開始的編程語言是什麼 瀏覽:757
at遠程命令 瀏覽:490
雲伺服器哪家好點 瀏覽:211
android系統源碼閱讀 瀏覽:924
dumpjava分析工具 瀏覽:678
怎麼下載cpu源碼 瀏覽:154
代碼加密怎麼取消 瀏覽:888
編譯原理代碼在哪裡運行 瀏覽:584
解密攝影pdf 瀏覽:72
演算法編程中級題目 瀏覽:250
c語言編譯器畢業設計 瀏覽:717
醫保卡申請app哪個好 瀏覽:945
阿里雲伺服器上傳源碼 瀏覽:602
營銷管理科特勒pdf 瀏覽:696
願望清單app哪個好 瀏覽:461
安卓外放聲音怎麼解決 瀏覽:195
脈脈app干什麼用的 瀏覽:361