旋转木驴 2016-12-27 05:34 采纳率: 100%
浏览 1109
已采纳

基础问题,关于继承时父类私有属性内存问题

java官方文档说在继承中子类不能继承父类的private属性,那么在程序运行中,new一个子类的实体在堆中时,此子类实体中会不会为父类的private属性值开辟内存?如果不开辟的话,那么下面这俩图,调用show方法压栈,然后其中的get方法随之压栈,那么这个get方法该到哪去找a的值呢?还是说当get方法压栈的时候a才以“局部变量”的身份直接在栈中储存,然后随着get弹栈而被适放?
。。。。。。求大神解答(没有c币可用。。。)图片图片

  • 写回答

3条回答 默认 最新

  • shadowfromsun 2016-12-27 08:02
    关注

    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的值。
    以上就是我的理解,希望可以对你有帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档