多态性、虚拟方法调用

Which of the following are legal names for variables.Mutiple

1) _int

2) %large

3) $fred

4) Integer   //LongDouble等包装器类似,都不是关键字

5) 2much

134

 

public class Test8 {

     public static void main(String [] args){

         Base b = new Subclass();

         System.out.println(b.x);

         System.out.println(b.method());

     }

}

class Base{

     int x = 2;

     int method(){

         return x;

     }

}

class Subclass extends Base{

     int x = 3;

     int method(){

         return x;

     }

}

多态性、虚拟方法调用

 

结果是

2

3

而不是

3

3

参看下面的几格解释

Employee e = new Manager()

e.department = " Finance " ; //department Manager的一个特殊属性// illegal

声明变量e后,你能访问的对象部分只是Employee的部分;Manager的特殊部分是隐藏的。这是因为编译器应意识到,e 是一个Employee,而不是一个Manager但重写的方法除外

多态性、虚拟方法调用

在你接收父类的一个引用时,你可以通过使用instanceof运算符判定该对象实际上是你所要的子类,并可以用类型转换该引用的办法来恢复对象的全部功能。

为什么说恢复对象的全部功能,就是因为上一格所描述的,子类对象赋给父类句柄后,该句柄不能访问子类的那些特殊属性和方法,要用就要重新造型。

这其实是多态参数的后续应用,形成这样一个链条:传入多态参数——instanceof判断类型——casting——恢复功能

Marcus Mork Test 3 57题大体体现了这个意思

多态性、虚拟方法调用

Employee e = new Manager();

e.getDetails();

    在此例中,Manager 重写了EmployeegetDetail()方法。被执行的e.getDetails()方法来自对象的真实类型:Manager。事实上,执行了与变量的运行时类型(即,变量所引用的对象的类型)相关的行为,而不是与变量的编译时类型相关的行为。这是面向对象语言的一个重要特征。它也是多态性的一个特征,并通常被称作虚拟方法调用——动态绑定

上述两个例子表明,属性不能虚拟调用,而方法可以,因为属性不能重写,哈哈。

多态性、虚拟方法调用

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值