激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - 淺談Java繼承中的轉型及其內存分配

淺談Java繼承中的轉型及其內存分配

2021-02-04 11:36超超boy Java教程

這篇文章主要介紹了淺談Java繼承中的轉型及其內存分配,首先分享了簡單的代碼及運行結果,然后對其進行分析,繼而引出了

看書的時候被一段代碼能凌亂啦,代碼是這樣的:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package 繼承;
abstract class people
  {
    public string tag = "瘋狂java講義";     //①
    public string name = "parent";
    string getname(){
      return name;
    }
  }
  class student extends people
  {
    //定義一個私有的tag實例變量來隱藏父類的tag實例變量
    string tag = "輕量級java ee企業應用實戰";     //②
    public string name = "student";
  }
  public class hidetest2
  {
    public static void main(string[] args)
    {
      student d = new student();
      //將d變量顯式地向上轉型為parent后,即可訪問tag實例變量
      //程序將輸出:“瘋狂java講義”
      system.out.println(((people)d).tag);     //④
      system.out.println(d.getname()); //parent
    }
  }

運行結果:

瘋狂java講義
parent

在這個代碼中,抽象父類people定義了兩個變量和一個getname()方法,子類student也定義了兩個和父類同名的變量,把父類的隱藏。

關于這段代碼的兩個困惑:1.子類實例化時必須首先實例化父類對象,而父類是抽象類,不能有對象。那到底子類實例化時產不產生父類對象???

2.d.getname();//返回的是parent,而不是student.不應該把父類的隱藏么??

書中是這么解釋的:

student對象會保存兩份實例變量,一份是people中定義的實例變量,一份是student中定義的實例變量,d變量引用一個student對象,內存示意圖如下:

淺談Java繼承中的轉型及其內存分配

將d向上轉型為parent對象,在通過它訪問name變量是允許的,也就是輸出“parent”。

但看著他的解釋還是有點不明白,說的不是很清楚,又去網上搜了下:

java子類實例化時是否同時存在一個父類對象.

假如父類a中有個inta=1;

子類b繼承a,同時b中覆蓋個inta=2;

運行:

atest=newb();

system.out.println(test.a);

結果是1,是父類中的屬性.這個時候是否存在父類對象,我的理解是存在的.

我又試,把父類用抽象abstract修飾,按理說abstract累不能實例化吧,肯定不能得到父類中的a屬性,結果還是一樣的.

怎么理解.

問題補充:

是不是創建子類對象,肯定會出現一個父類的對象?

精彩回答

不會產生父類對象,只是用了父類的構造函數而已,并不是用到構造函數就會產生對象,構造函數只是起對象初始化作用的,而不是起產生對象作用的,如果newa();即只有new語句才會產生父類a的對象。

變量是靜態綁定,方法是動態綁定。這里面變量在編譯期間實現了變量調用語句與變量定義賦值語句的綁定,綁定的自然是父類的,因為調用時類型是父類的,所以值是父類中定義的值

其實你可以這么理解創建了一個子類對象時,在子類對象內存中,有兩份這個變量,一份繼承自父類,一份子類。

絕對不會產生父類對象,父類中的成員被繼承到子類對象中,用指向子類對象的父類引用調用父類成員,只不過是從子類對象內存空間中找到那個被繼承來的父類成員,也就是說實質是用子類對象調用變量a,這樣就可以解釋成員必須通過對象調用的規定,只不過這時調用的是子類對象中的繼承自父類的a(子類對象中有兩個a,一個繼承自父類,一個屬于自己)

哎,話說的有些亂。這個問題也困惑我很久,上網查詢發現很多人是錯誤的,最后找到幾篇好的文章才明白,可能很多java老手也都會犯“產生父類對象”這個錯誤,最近才搞明白。

你自己想想,如果產生父類對象,如果父類是抽象類,抽象類允許產生對象嗎?所以這種說法不嚴謹

動態綁定定義

動態綁定是指在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法

靜態綁定與動態綁定

除了限制訪問,訪問方式也決定哪個方法將被子類調用或哪個屬性將被子類訪問.函數調用與函數本身的關聯,以及成員訪問與變量內存地址間的關系,稱為綁定.

在計算機語言中有兩種主要的綁定方式,靜態綁定和動態綁定.靜態綁定發生于數據結構和數據結構間,程序執行之前.靜態綁定發生于編譯期,因此不能利用任何運行期的信息.

它針對函數調用與函數的主體,或變量與內存中的區塊..動態綁定則針對運行期產生的訪問請求,只用到運行期的可用信息.在面向對象的代碼中,動態綁定意味著決定哪個方法被調用或哪個屬性被訪問,

將基于這個類本身而不基于訪問范圍.

子類在創建實例后,類初始化方法會調用父類的初始化方法(除了java.lang.object類,因為java.lang.object類沒有父類),而這種調用會逐級追述,直到java.lang.object的初始化方法。

這個地方我說的是初始化方法,而不是構造方法,因為構造方法是相對于java源程序而言,而編譯后的class文件是初始化方法即"<init>"方法(紅色部分為方法名),

初始化方法是由java源程序的三個部分組成的,一個部分是成員字段后的直接的初始化語句,例如privateinti=0;privatedatedate=newdate();等等,第二個部分是由初始化塊組成,例如:

javacode

publicclasstest{

privateinti=0;//初始化第一部分

//以下大括號內為初始化第二部分

{this.i=4;//dosomething......}}

第三個部分就是java源代碼中的構造方法中的代碼,java源代碼中有幾個構造方法,那么class文件中就有幾個初始化方法,編譯器會把第一部分與第二部分分別復制到每個初始化方法的前端,然后把初始化

方法對應參數的構造方法的代碼復制到相應初始化方法中(這里說的復制其實應該說是編譯,不過為了讓你更好理解所以如此說).

那么說初始化方法如何追述其父類的,這也關系到初始化方法的結構,初始化方法的執行順序以及結構就如上所說,但是每個初始化方法的第一個執行指令就是調用另外一個初始化方法,

這個初始化方法可能是自身類某個初始化方法,例如你的構造函數中第一句有類似this(...)這種語句,那么初始化方法就會調用自身類的指定構造方法;如果你的構造方法中沒有指定構造方法調用,

那么初始化方法會默認調用父類無參數初始化方法,如果你的子類第一句為super(....),那么初始化方法會調用父類指定初始化方法。這種調用過程會遞歸進行調用,直到這個類是java.lang.object類。

調用初始化方法并不代表會生成對象,你的java代碼中出現new關鍵字加上構造方法的調用,只會生成一個對象,其父類對象不會生成,所以調用父類為抽象類的構造方法完全是合理的。

而且初始化方法對于虛擬機來說只是一個名稱叫做"<init>"的普通方法,區別只是生成對象以后調用而已(sun的jdk私有包中有繞過構造方法生成對象的方式,可以證明之上說法,具體如何我這里不陳述)。

然后回答你的第二個問題,抽象類中的構造方法其實是用來給繼承的子類來用的,因為構造方法相當于初始化方法,當子類調用構造方法時必須調用父類構造方法,

所以你可以在子類產生對象時抽象類中按需求初始化抽象類中的字段以及執行一些初始化代碼。其實并不是一定要生成某個類的實例才調用構造方法,子類也需要調用父類構造方法。

而生成實例也并不一定會調用構造方法,在某些特殊實現中或者特殊情況下,生成實例不會調用構造方法。而調用了構造方法也不一定就生成了一個實例,但是那一定是一個實例調用的,就像一個普通的實例方法一樣。

總結

以上就是本文關于淺談java繼承中的轉型及其內存分配的全部內容,希望對大家有所幫助,有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

原文鏈接:http://www.cnblogs.com/jycboy/p/5373690.html

延伸 · 閱讀

精彩推薦
971
主站蜘蛛池模板: 亚洲午夜久久久精品一区二区三区 | 国产精品一区在线免费观看 | 国产精品毛片va一区二区三区 | 一级毛片免费大片 | 91短视频网址 | 一级黄色毛片a | 一区二区三区视频播放 | 国产精品白嫩白嫩大学美女 | 久久久久久久高清 | 视频一区二区在线播放 | 激情网站在线观看 | 国产精品久久久久网站 | 精品亚洲二区 | 午夜视频中文字幕 | 九九热九九爱 | 男女羞羞视频在线免费观看 | 国产精品久久久久久影院8一贰佰 | 国产精品久久久久久久不卡 | 久久99久久98精品免观看软件 | 在线免费观看毛片视频 | 成年性羞羞视频免费观看无限 | 日韩一级成人 | 亚洲第一页综合 | 午夜视频久久 | 日日噜噜噜噜久久久精品毛片 | bt 自拍 另类 综合 欧美 | avlululu | 欧美a在线观看 | 日日艹夜夜艹 | 日韩视频一区在线 | 午色影院| 久久久久久久久久久亚洲 | 黄视频免费在线观看 | www.91sp| 久久久久久亚洲国产精品 | 成人免费在线视频播放 | 欧美成人二区 | 视频在线色 | 欧美一级一区二区三区 | 91香蕉影视 | 高清国产免费 |