浏览 1141 次
锁定老帖子 主题:java动态绑定
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-30
对象方法的执行过程:
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)
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |