黑马程序员技术交流社区
标题:
多态的一个小问题
[打印本页]
作者:
一生一世
时间:
2012-4-25 21:22
标题:
多态的一个小问题
大家好,我是一个菜鸟,最近学习java的时候遇到了一个问题,希望大家能够帮帮我:
就是多态也(即动态绑定或池绑定)在内存中是怎么样运行的,在内存分配的四块空间中(stack,heap,date segment和code segment)怎么样存储,怎么样运行?谢谢
作者:
袁冬梅
时间:
2012-4-25 22:02
我也来说说。。。。
class Fu
{
public void show(){
System.out.println("show fu");
}
}
class Zi extends Fu
{
public void show()
{
System.out.println("show zi");
}
public static void main(String[] args)
{
Fu f = new Zi();
f.show();
}
}
复制代码
看上面这个小代码和图片:
在main方法中,我创建了一个Fu类的引用f,这个f存放在,栈内存中的main方法片区里面
当new Zi();一执行,就会在堆内存中创建一个Zi类对象。f这个引用就会指向堆内存中新new出来的那个对象(也就是说那个对象在堆内存中的地址会存放在f中)。
等我们调用f的时候,其实这个f指向的是堆内存中存在的Zi类对象,因此调用的方法也是Zi类对象里面的show方法。如果我在Zi类方法中再定义一个父类没有的方法,那么f这个引用就不能调用那个方法了。
战队.jpg
(518.96 KB, 下载次数: 24)
下载附件
2012-4-25 22:01 上传
作者:
小鹿叙鹿
时间:
2012-4-25 23:06
class Anmail{
public String name;
}
class Dog extends Anmail{
pubic int age;
Dog(){
}
作者:
小鹿叙鹿
时间:
2012-4-25 23:17
class Anmail{
public String name;
Anmail(){
show();
}
}
class Dog extends Anmail{
pubic int age=9;
Dog(){
super()//默认调用父类的无参构造函数
this.age=age;
}
public void show(){
System.out.println(num);
}
public static void main(String[] args){
Fu fu=new Zi();
fu.show();
}
}
在对父子类进行编译的时候,会被编译成class文件,当虚拟机把主函数加载到内存中的时候,即main被加载到栈中,当运行到Fu fu=new Zi();的时候,会把父类与子类的class文件加载到内存中
这时虚拟机走到new Zi()的时候,会对其成员变量在堆中进行默认初始化,会调用子的构造函数对其初始化,但是子类的构造函数的第一条语句是super即父类的无参构造函数。这个时候,调用父类的无参构造函数,但是这时候父类会持有
子类的一个引用即this,当进入到父类的构造函数中是,调用到show方法,这个方法不是父类的,而是this引用对象的那个,所以会调用子类的方法。到此,第一句话结束,运行到fu.show()的时候,
由于要看实际运行的是那个类,所以调用的还是子类的方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2