程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> jvm-基礎問題,關於繼承時父類私有屬性內存問題

jvm-基礎問題,關於繼承時父類私有屬性內存問題

編輯:編程解疑
基礎問題,關於繼承時父類私有屬性內存問題

java官方文檔說在繼承中子類不能繼承父類的private屬性,那麼在程序運行中,new一個子類的實體在堆中時,此子類實體中會不會為父類的private屬性值開辟內存?如果不開辟的話,那麼下面這倆圖,調用show方法壓棧,然後其中的get方法隨之壓棧,那麼這個get方法該到哪去找a的值呢?還是說當get方法壓棧的時候a才以“局部變量”的身份直接在棧中儲存,然後隨著get彈棧而被適放?
。。。。。。求大神解答(沒有c幣可用。。。)圖片圖片

最佳回答:


A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.
子類不能繼承父類的私有成員。然而,如果父類有公共的或受保護的方法來訪問它的私有字段,也可以使用這些子類。

DemoSon.java

class Demo{
    private int a = 3;
    private int b = 3;
    private int c = 3;

    public Demo(int b){
        this.b = b;
    }
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }
    public int getC() {
        return c;
    }
    public void setC(int c) {
        this.c = c;
    }

}

public class DemoSon extends Demo {

    private int c;
    public DemoSon() {
        super(0);
    }
    public DemoSon(int b,int c) {
        super(b);
        this.c = c;
    }
    // 這裡不用再寫 getA的函數 ,因為 已經繼承了來自父親 的getA
    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }


    public static void main(String args[]){
        DemoSon ds1 = new DemoSon();
        DemoSon ds2 = new DemoSon(3, 5);
        System.out.println("ds1: " + ds1 + "   a:" +ds1.getA() + "  b :" +ds1.getB()+"  c: " +ds1.getC());
        System.out.println("ds2: " + ds2 + "   a:" +ds2.getA() + "  b :" +ds2.getB()+"  c: " +ds2.getC());
        System.out.println("- - - - - - - - - - - - - - -");
        ds2.setA(4);
        ds2.c = ds2.c + 1;
        System.out.println("ds1: " + ds1 + "   a:" +ds1.getA() + "  b :" +ds1.getB()+"  c: " +ds1.getC());
        System.out.println("ds2: " + ds2 + "   a:" +ds2.getA() + "  b :" +ds2.getB()+"  c: " +ds2.getC());
    }
}

圖片說明

以上的代碼和結果圖片看一看出來,Demo.a 與你所定義的a 是同一個類型的,結果也一致,但是我定義的這個DemoSon使用了自己的c,
所以ds1訪問不到父類的C,而是輸出了自己的默認值0,而元素b,都是在實體化對象的時候將值傳給Demo進行的實例化,而不是自己直接賦值。
所以應該是實例化的對象包含有沒有被覆蓋掉的父類的所有值,並給他們開辟內存空間。以下2個圖片應該可以證明

下圖是debug時,在當前位置的ds2的內容,看到a是在於DemoSon的對象ds2的內存裡的
圖片說明

此處下面的圖片是上圖同一時刻棧的內存內的值:
圖片說明

在內存棧ds1和ds2的下方都包含a,b,c,a,b是來自父類,而c是來自自身,雖然ds1並沒有對c賦值,但是c值依然是自身的默認值0,而非3,
而且ds2對b進行修改時,ds1的b值並沒有改變。也說明了 不是說在獲取a是再去找a的值。
以上就是我的理解,希望可以對你有幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved