关于多态

class A {} /*定义一个类*/
A a; /*定义一个引用,这个引用是类A的引用,但它现在没有引用任何东西,它是null*/
a = new A(); /*new A()创建了一个实例,然后让a引用这个实例*/
关于变量a,或者说引用a,我们说它的静态类型为A,因为我们声明a是用的A a; 我们说a的动态类型也为A,因为a = new A();,所以它引用的动态类型还是A。也就是说,声明一个引用时,类型声明的类型就是它的静态类型,而通过赋值赋给它的一个new X(),X就是它的动态类型。

关于一个类A还不是很明显,因为它的静态类型和动态类型是一样的。那我们再说这样一个例子。
class Base {} class Derived extends Base {}
Base a = new Base();
a = new Derived();
第一句中,a的静态类型和动态类型都是Base;而第二句中,a的静态类型是Base,动态类型则变成了Derived。(同时,第一句中的那个Base对象就丢失了。)

知道静态和动态以后,我们就再来说说多态。所谓多态,顾名思义,就是多种的X态。静态还是动态?显然,对一个引用而言,静态类型是声明的时候就已经确定好的,不能变;那么我们变的只能是动态。那么多态,也就是指,对于一个引用,我们可以根据它不同的动态类型来调用它实际的方法。

class Base { void f() {} }
class Derived extends Base { void f() {} }
Base a = new Base(); a.f();
a = new Derived(); a.f();
看这么一个例子。最开始,a调用的那个f()方法应该是Base类中定义的方法,而后面,a调用的那个f()方法就是Derived类中定义的方法了。原因就是第一次调用时,a的动态类型是Base,而第二次调用时,它的动态类型是Derived了。

这个就是Java中方法的多态。在一个引用上调用方法时,系统会自动找到这个引用引用的实际类型,然后去调用这个实际类型中定义的方法。

另外,需要注意的一点是,类中的属性是没有多态性的,即你在引用上面使用属性时,系统只会去找引用的静态类型中的那个属性,而与它的实际类型无关。

而静态方法也是没有多态性的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值