黑马程序员技术交流社区

标题: Day07-4 子父类中变量的特点 6:25左右 [打印本页]

作者: 王瀛    时间: 2013-5-25 18:29
标题: Day07-4 子父类中变量的特点 6:25左右
毕老师的基础视频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. }
复制代码

作者: 梁秋瑜    时间: 2013-5-25 18:44
System.out.println(super.num);会报错,因为子类不能继承父类的私有成员
作者: 王瀛    时间: 2013-5-25 19:01
梁秋瑜 发表于 2013-5-25 18:44
System.out.println(super.num);会报错,因为子类不能继承父类的私有成员

结果我知道,但是毕老师画的数据在内存中的调用过程不明白
作者: 神之梦    时间: 2013-5-25 19:39
那图画了好几部分,堆部分楼主懂么?
还是方法区的部分不懂?
作者: 喜欢流浪    时间: 2013-5-25 19:51
根据这个代码,当JVM 找到main主函数时,在堆内存中首先就开辟了空间new Zi();这个空间有属性的,那就是Zi自己的num 和 Fu.num(因为要Zi继承了Fu,所以加载Fu的num在先,加载Zi的num在后)!
方法去就更简单了。俩个空间,一个属于Fu,一个属于Zi;Zi里面默认存在有this,和super。
估计楼主是受System.out.println(super.num); 影响。这是权限的问题了!就相当于父类的私有特征,比如胎记之类的!子类再怎么调用 都调用不来的!

作者: 刘茂林    时间: 2013-5-25 19:54
  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. }
复制代码

作者: 张旺达    时间: 2013-5-25 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
楼上讲的很好,我说下为什么。
为什么要分开存放类和对象?因为对象共享类。每当new一个对象时,先从方法区中找到类原型,再按着一定规则映射到堆内存中实例化为一个具体对象。这样对象可以在内存中创建多个,但类在内存中只存在一个。
引用可以理解为指针,它的值就是地址,指向其声明时创建的对象的地址。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2