动态绑定是不是只有在继承上才有的?
动态绑定是如何实现的?
动态绑定说是在运行的时候确定调用的方法,为什么不能在编译的时候出现?
在继承上如何实现动态绑定?例:
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
}
}上面的例子好像说明:使用超类引用变量引用子类对象,这个变量调用的方法必须在超类中存在。请问是不是这样
动态绑定是如何实现的?
动态绑定说是在运行的时候确定调用的方法,为什么不能在编译的时候出现?
在继承上如何实现动态绑定?例:
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
}
}上面的例子好像说明:使用超类引用变量引用子类对象,这个变量调用的方法必须在超类中存在。请问是不是这样
解决方案 »
- Java 中 .setVisible(false);之后是否还在运行?
- 一个小型计算器程序,还有最后一个难点。。求指教
- 关于java
- java开发用什么OS好?
- 请问在java编程中,某些有可能会出现异常的地方,一定要抛出异常。不抛出是不是会编译通不过?
- java 随机取出定义数组中的元素且不重复 然后把取出的元素排序 在输出为TXT文本文件
- java的applicaton为何找不到mysql的driver
- C++ --> Java ????
- 请问谁有用JDBC连接MySQL的样例程序?
- System.out.print();和System.out.println();的区别
- JAVA用什么储存树型结构的效率最高?高手帮帮忙
- JTable焦点问题
-----
就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给你做了。
如果要调用子类的方法,必须强行转换
((Manager)parent).third();
parent是Employee类型,所以parent只能访问Employee的方法,但是parent引用的是Manager的实例,所以可以把parent进行强行转换后访问Manager的方法。