A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 芦青 中级黑马   /  2013-3-1 23:19  /  1893 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class person
{
        private int age;
        private String name;
       
        public int getAge()
        {
                return age;
        }
       
}

class work extends person
{
        public int getAge()
        {                                   //getAge() 是继承过来的,方便大家看,我写在work类中..
                return age;
        }
}

public class Demo
{
        public static void main(String[] args)
        {
                work p=new work();
                System.out.print(p.getAge());
        }
}

这里因为简洁点,我让age和name是默认值..

我想问的是:work类在继承person类的时候,没有继承属性,只继承了一个getAge()方法..

为什么work类创建的对象访问getAge方法的时候,为什么会返回age的默认值,work里不是没有age属性

嘛,我也知道返回的是父类里的age属性..我就是想知道子父类在内存中是怎样操作的?谁能帮我画个简

洁点的内存图 分析下?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 神马都是浮云

查看全部评分

6 个回复

倒序浏览
你有哪步搞错了,这个是不可能编译成功的,父类已经把成员变量私有了,子类无法访问到age成员变量的,编译时会提示错误,如果你编译成功了,那你肯定是把age的修饰符private给去掉才可以。你自己在检查一下


个人猜测你的私有修饰符是后加上去的,然后没保存{:soso_e122:}
回复 使用道具 举报
起航 发表于 2013-3-1 23:39
你有哪步搞错了,这个是不可能编译成功的,父类已经把成员变量私有了,子类无法访问到age成员变量的,编译 ...

work类里面是空的,没有getAge方法,我是为了体现下父类的private属性继承不过来,而一般属性能继承过来,才写在woke类里面的,你就当work类里面什么都没写..
回复 使用道具 举报
这个很好说吧 我也不是高手,也是新手 这里也刚看过我说下我的理解吧。

打比方你就是父类,你有儿子继承你,你的东西他都可以继承,但是你有些东西是不想让他知道的,例如:你的某些不良癖好{:soso_e120:},你就给他加个修饰符private私有起来,那这个就只有你自己可以访问,任何都不可以了,不存在什么原理的,别想复杂了,私有就是私有,这个就跟法律一样,是java中的法律,规则。

至于内存图,你定义的成员变量在内存中的栈空间中,私有后就只有自己可以访问,而子类继承的时候,子类的栈空间中是没有该成员变量的。


以上是我的理解,因为也是新手不一定对,但是感觉应该就是这样吧{:soso_e101:}别吐槽我 哈哈

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我将你的代码做了如下修改:
  1. class person
  2. {
  3.         private int age;
  4.         private String name;
  5.         person(int age)
  6.         {
  7.                 this.age = age;
  8.         }
  9.         
  10.         public int getAge()
  11.         {
  12.                 return age;
  13.         }
  14.         
  15. }

  16. class work extends person
  17. {
  18.         work(int age)
  19.         {
  20.                 super(age);               
  21.         }
  22. }

  23. public class Demo
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 work p=new work(23);
  28.                 System.out.print(p.getAge());
  29.         }
  30. }
复制代码
我感觉是这样滴,你在person中少了一个构造函数,此函数用来初始化age的值,然后在work里不需要写getAge,而是写一个够早函数,将age值传递给父类,以此来调用父类中的功能。个人理解,望指正~~~

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
是这样的一个过程。

过程.png (32.02 KB, 下载次数: 35)

运行过程

运行过程

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
哈哈,错误!!!
子类继承父类时,这个子类拥有父类所有的成员属性和方法,即使是父类里有private属性的变量,子类也是继承的,只不过不能使用,也就是说,它继承了,但是没有使用权,似乎又点矛盾,用我们通俗的说法就是 只能看,不能用。而不是像你理解的“没有继承属性,只继承了一个getAge()方法..”

但是,我们还是可以通过set 和get的方法来间接的访问父类中的private属性的变量
(技术分啊!!!!!!,版主你就给一分嘛)

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马