【java】 关于动态绑定

jasonchain 2007-10-14 10:05:33
动态绑定是不是只有在继承上才有的?
动态绑定是如何实现的?
动态绑定说是在运行的时候确定调用的方法,为什么不能在编译的时候出现?
在继承上如何实现动态绑定?

例:
class Employee
{
public void first()
{
System.out.println("Super.first");
}
public void second()
{
System.out.println("Super.second");
}
}

class Manager extends Employee
{
public void first()
{
System.out.println("Child.first");
}
public void third()
{
System.out.println("Child.third");
}
}

public class Test
{
public static void main(String[] args)
{
Employee parent = new Manager();
parent.first();
parent.second();
parent.third();//error
}
}

上面的例子好像说明:使用超类引用变量引用子类对象,这个变量调用的方法必须在超类中存在。

请问是不是这样









...全文
71 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2007-10-14
  • 打赏
  • 举报
回复
正是这样
如果要调用子类的方法,必须强行转换
((Manager)parent).third();
parent是Employee类型,所以parent只能访问Employee的方法,但是parent引用的是Manager的实例,所以可以把parent进行强行转换后访问Manager的方法。



xiyuan1999 2007-10-14
  • 打赏
  • 举报
回复
3个条件同时满足 才可以
gfaz2007 2007-10-14
  • 打赏
  • 举报
回复
parent虽然是子类Manager类型的对象,但对于子类Manager类型的方法是不可见的,因为是用父类Employee类型声名的。只有经过强制类型转换(Manager)parent操作后,才可以用Manager类的方法,即所谓的多态。
xiyuan1999 2007-10-14
  • 打赏
  • 举报
回复
动态绑定是不是只有在继承上才有的?
动态绑定是如何实现的?
动态绑定说是在运行的时候确定调用的方法,为什么不能在编译的时候出现?
在继承上如何实现动态绑定?

条件:
1.继承
2.重写
3.父类引用指向子类对象
manbaum 2007-10-14
  • 打赏
  • 举报
回复
动态绑定是不是只有在继承上才有的?
-----
就java语言来说,好像说的没错。


动态绑定是如何实现的?
-----
通过类的虚函数表实现的。建议你看看《深入java虚拟机》一书,里面有对此的详细描述。


动态绑定说是在运行的时候确定调用的方法,为什么不能在编译的时候出现?
-----
编译/连接时能绑定的,那就叫静态绑定了。比如继续楼主的例子:

public class Tester : Employee {

public void first() {
System.out.println("Tester.first()");
}
}

public class Test2 {
public static void callFirst(Employee e) {
e.first();
}

public static void main(String[] args) {
Employee joe = new Manager();
callFirst(joe);
Employee michael = new Tester();
callFirst(michale);
}
}


callFirst() 方法在编译时,并不能确定参数e传进来的真实类型是什么,所以无法确定e.first()该执行哪段代码,所以要用到动态绑定。


在继承上如何实现动态绑定?
-----
动态绑定不用程序员去实现,jvm给你做了。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧