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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一生一世 中级黑马   /  2012-4-28 20:40  /  1889 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多态在内存中的执行过程?大家有谁知道吗?就是怎么样动态绑定的?

2 个回复

倒序浏览
java运行时,在内存里分四个部分。栈,堆,数据区和代码区。。举个例子String str=new String("AAA");str就放在栈里,字符串"AAA"放在堆里。所有的方法代码都放在了代码区。

public class A{
public void show(){
System.out.println("A");
}
}
public class B extends A{
public void show(){
System.out.println("B");
}
public void say(){
System.out.println("B says");

}
}

当A a=new B()时,在栈里就有了一个a,而在堆里有个B的对象。。因为a是A类型的,所以它只能看到A里面所包含的属性和方法(此处的方法只是一个方法头,代码在代码区。。)。当调用show方法时,a先找到了自己的方法(头),然后到代码区去找方法体,发现有两个show方法.于是虚拟机会判断调用该方法的具体对象是什么,从而选择相应的方法。从而产生多态。而当调用say方法时,a没在自己代码里找到say方法,所以就不能通过了。。这也就解释了,为什么父类引用不能调用子类自己的方法了。。


回复 使用道具 举报
所谓的动态绑定其实也是依赖编译时类的定义。
为什么这么说了?是因为多态依赖继承且依赖虚函数机制。
当你的子类重新定义了父类的方法,那在子类中该方法就替换为子类重新定义的那个方法。
当你动态创建一个对象时肯定对象的类型是确定的,那该对象的字节码也是确定的,这个对象具有的方法就是确定的。
所以当你用父类的对象引用一个子类的对象时其实子类对象的字节码是确定的,那其实其调用的方法是确定的。
所以当调用被子类重新定义的方法时其方法的字节码也是确定的,所以对于不同的子类该方法虽执行的代码不同但都是确定的,
所以编译器能决定到底是调用哪个方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马