对象方法的执行过程:
1).编译器查看对象的声明类型和方法名。假设调用x.f(param),对象x中可能会存在多个f方法,它们有不同的参数类型,比如f(int), f(String), f(double)等,编译器会列举x类中所有名为f的方法和其超类中访问属性为public且名为f的方法。
经过上述过程,编译器获得所有可能被调用的候选方法。
2).编译器查看调用方法时提供的参数类型。如果所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择该方法。这个过程被称为重载解析(overloading resolution)
注:方法的签名指的是方法名字,加上方法的参数列表。
1)子类覆盖父类的方法,但该方法不能拥有比父类更严格的访问控制。特别是当父类方法是public时,子类一定要是public,否则编译器将认为该方法使用的是默认的访问控制修饰符,降低了访问控制权限,因此报错了。
2)返回类型不是方法签名的一部分,在进行方法覆盖的时候,javase5之前要求返回类型要一致。但是javase5以后允许覆盖方法的返回类型为原返回类型的子类型,称之为可协变的返回类型(covariant return type)
举个例子:
public class Demo {
public static void main(String[] args) {
A a = new B();
C c = a.display() ;
c.display() ;
}
}
class A {
public C display() {
System.out.println("this is from A!");
return new C();
}
}
class B extends A {
public D display() {
System.out.println("this is from B!");
return new D() ;
}
}
class C {
public void display() {
System.out.println("this is from C!!!");
}
}
class D extends C {
public void display() {
System.out.println("this is from D!");
}
}
程序的返回结果:
this is from B!
this is from D!
这其中的B和A的display方法就是具有协变的返回类型,因为B的display方法覆盖了A的display方法,然后B的display返回的结果类型是D,D是C的子类,而A的display返回结果正好是C。因此构成可协变的返回类型(covariant return type)
3)当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用所引用对象的实际类型最合适的那个类的方法。
例如:C x = new D(); // D extends C
x.f(String);
x引用的实际类型是D,它是C的子类。如果D定义了方法f(String),就直接调用他,否则在其超类中寻找f(String),以此类推。
每次调用方法都要进行搜索,时间开销相当大。虚拟机的解决方法是,为每个类创建一个方法表(method table),列出所有方法的签名,和实际调用的方法。以后,每次调用一个方法,虚拟机只需要找这个表就可以了。
分享到:
相关推荐
详细介绍了java动态绑定和静态绑定的区别
非常详细的介绍了Java动态绑定和内联,还运用了大量的例子,值得一看!
主要介绍了java动态绑定和静态绑定用法,结合实例形式详细分析了java动态绑定与静态绑定相关概念、原理、实现方法及使用注意事项,需要的朋友可以参考下
Java动态绑定的方法重载的实现
Java动态绑定的方法重载的实现.pdf
这篇文章我们将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。 静态绑定机制 //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println(...
主要帮助大家理解Java中的静态绑定和动态绑定,在Java中存在两种绑定方式,一种为静态绑定,另一种就是动态绑定,亦称为后期绑定,感兴趣的小伙伴们可以参考一下
对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。 静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。 针对java简单的可以理解为程序编译期的...
java代码绑定时间,请按要求填写,规范统一
xml java 绑定xml java 绑定xml java 绑定
Java中的静态绑定和动态绑定Java开发Java经验技巧共8页.pdf.zip
主要介绍了Java 静态绑定与动态绑定深入分析的相关资料,这里对java 的动态绑定和静态绑定做了详细的介绍,对其进行总结整理,需要的朋友可以参考下
主要介绍了Java多态中动态绑定原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在Java中实现Oracle变量的绑定方法 .doc 在Java中实现Oracle变量的绑定方法 .doc
java实现公众号绑定域名,微信消息接收和token验证功能
理解静态绑定与动态绑定 * Java程序从源文件创建到程序运行要经过两大步骤: * 绑定 * 绑定分类 * 绑定的其他叫法 * 静态绑定 * 识别静态绑定的三个关键字以及各自的理解 * 动态绑定 * 概念 * 代码理解 * 动态绑定的...
Java与XML数据绑定 Java与XML数据绑定 Java与XML数据绑定
java实现对echarts 属性全动态设置 数据动态绑定。封装echarts 的绘图方法,使得js只需要getLine(data),getBar(data)等就可以绘制图形。echarts上的所有属性都可以在java中设置。
Java虚拟机的动态绑定与静态绑定 大家可能都知道Java面向对象的三大特性,封装,继承,多态,其中动态绑定就与多态有关,那什么是动态绑定呢? 1.动态绑定(auto binding):也叫后期绑定,在运行时,虚拟机根据具体...