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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王瀛 高级黑马   /  2013-5-25 18:29  /  1966 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师的基础视频Day07-4 子父类中变量的特点 6:25左右的地方对下面代码在内存中调用过程进行了讲解,听了几遍没听明白,谁给解释一下。
  1. class Fu
  2. {
  3.         private int num = 4;
  4. }

  5. class Zi extends Fu
  6. {
  7.         int num = 5;
  8.         void show()
  9.         {
  10.                 System.out.println(super.num);
  11.         }
  12. }

  13. class ExtendsDemo
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Zi z = new Zi();
  18.                 z.show();
  19.         }
  20. }
复制代码

7 个回复

倒序浏览
System.out.println(super.num);会报错,因为子类不能继承父类的私有成员
回复 使用道具 举报
梁秋瑜 发表于 2013-5-25 18:44
System.out.println(super.num);会报错,因为子类不能继承父类的私有成员

结果我知道,但是毕老师画的数据在内存中的调用过程不明白
回复 使用道具 举报
那图画了好几部分,堆部分楼主懂么?
还是方法区的部分不懂?
回复 使用道具 举报
根据这个代码,当JVM 找到main主函数时,在堆内存中首先就开辟了空间new Zi();这个空间有属性的,那就是Zi自己的num 和 Fu.num(因为要Zi继承了Fu,所以加载Fu的num在先,加载Zi的num在后)!
方法去就更简单了。俩个空间,一个属于Fu,一个属于Zi;Zi里面默认存在有this,和super。
估计楼主是受System.out.println(super.num); 影响。这是权限的问题了!就相当于父类的私有特征,比如胎记之类的!子类再怎么调用 都调用不来的!
回复 使用道具 举报
  1. class Fu
  2. {
  3. //话说你运行过没  这里要改成受保护的或者 公共的才性
  4.         protected int num = 4;
  5. }

  6. class Zi extends Fu//子类继承父类
  7. {
  8.         int num = 5;//子类的num = 5
  9.         void show()//打印的方法
  10.         {//因为这里用了super  所以打印的是父类的num的值  为 4
  11.                 System.out.println(super.num);
  12.         }
  13. }

  14. class ExtendsDemo
  15. {//主方法
  16.         public static void main(String[] args)
  17.         {//创建对象引用
  18.                 Zi z = new Zi();
  19.                 z.show();//调用子类中的打印方法  打印结果 当然是4
  20.         }
  21. }
复制代码
回复 使用道具 举报
你是说的那个图哈

堆中
在堆里建立一个new Zi()对象,开始分配属性空间,但是属性空间有两个,一个是子类引用的一个是父类引用的。当你在new子类对象的时候,会加载Zi.class,但是在这之前会先加载Fu.class。

方法区中
分静态区和非静态区,非静态区存的是方法,既有Fu的方法空间也有Zi的方法空间。这时子类里既有this的引用,也有super的引用。

然后你就记住老师总结的东西就可以了。

变量
如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量用this,要访问父类中的同名变量用super。
super的使用和this的使用几乎一致,this代表的是本类对象的引用,super代表的是父类对象的引用。
回复 使用道具 举报
yooc 中级黑马 2013-5-25 22:20:42
8#
楼上讲的很好,我说下为什么。
为什么要分开存放类和对象?因为对象共享类。每当new一个对象时,先从方法区中找到类原型,再按着一定规则映射到堆内存中实例化为一个具体对象。这样对象可以在内存中创建多个,但类在内存中只存在一个。
引用可以理解为指针,它的值就是地址,指向其声明时创建的对象的地址。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马