黑马程序员技术交流社区
标题:
Day07-4 子父类中变量的特点 6:25左右
[打印本页]
作者:
王瀛
时间:
2013-5-25 18:29
标题:
Day07-4 子父类中变量的特点 6:25左右
毕老师的基础视频Day07-4 子父类中变量的特点 6:25左右的地方对下面代码在内存中调用过程进行了讲解,听了几遍没听明白,谁给解释一下。
class Fu
{
private int num = 4;
}
class Zi extends Fu
{
int num = 5;
void show()
{
System.out.println(super.num);
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show();
}
}
复制代码
作者:
梁秋瑜
时间:
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
class Fu
{
//话说你运行过没 这里要改成受保护的或者 公共的才性
protected int num = 4;
}
class Zi extends Fu//子类继承父类
{
int num = 5;//子类的num = 5
void show()//打印的方法
{//因为这里用了super 所以打印的是父类的num的值 为 4
System.out.println(super.num);
}
}
class ExtendsDemo
{//主方法
public static void main(String[] args)
{//创建对象引用
Zi z = new Zi();
z.show();//调用子类中的打印方法 打印结果 当然是4
}
}
复制代码
作者:
张旺达
时间:
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