08 多态

概述:面向对象语言中,多态是继抽象和继承之后的第三种基本特征。面向对象语言的4大特征:继承、封装、多态、抽象。
面向对象语言的4大特征:
抽象:一个类是抽象的,表示一类事物。
封装:通过合并特征和行为来创建新的数据类型。
继承:实现代码的复用。允许对象作为本身类型和其父类使用。
多态:消除类型之间的耦合关系。

多态介绍:多态方法允许同一父类的一种类型,表现出与其他相似类型之间的区别,通过方法不同的行为的不同表示出来。

1、向上转型与多态

向上转型:把某个对象的引用用视为其父类类型的引用。
多态发生条件:①有共同的父类②子类覆盖(重写)父类方法③子类引用当成父类对象
多态经典实例:

2、多态细节

2.1前期绑定与后期绑定

前期绑定:在程序执行前进行绑定(编译器和连接程序实现)。
后期绑定:也叫动态绑定和运行时绑定,即在程序运行时进行绑定。
在java中,除了static方法和final方法(private方法属于final方法)之外,其他方法都是后期绑定。
多态中类型的确定是后期绑定,也就是说动态的通过类型的改变去调用不同的行为(方法)。

note:
 1)private方法属于final方法的解释:
      final的方法不可被override(覆盖),final方法也是。都是受保护的。

2.2多态使程序可扩展

所有的多态都是通过父类对象进行通信的。这样的程序是可扩展的,通过基类继承出新的数据类型,从而新添加一些功能。而那些操作基类的接口的方法不用改变。
换一句话:当我们需要改变一个方法的行为时,只需要添加基于父类的新类型,覆盖方法就可以了。

2.3多态的“缺陷”

2.3.1不能覆盖父类的私有方法

如图:这样做,不是覆盖,这是子类的一个全新的方法。

2.3.2域与静态方法不能发生多态行为

不是所有的事物多可以多态发生。 只有普通方法的调用可以是多态的
1:属性不能发生多态

说明:在一般情况下,属性都会是private。
2:静态方法不能发生多态
原因:静态方法是前期绑定的,或者说静态方法不能覆盖(重写),再说:静态方法是类的,不是单个对象的,多态是发生在对象之间的。

3、构造方法与多态

构造方法不能发生多态行为。(think in java说:构造方法实际上是static,不过该static声明是隐式的)。

3.1构造器的调用顺序

先调用父类的构造方法,然后调用子类的。按照继承链层次向下进行调用。
构造方法的作用是:初始化对象。
具体过程:
1)调用父类的构造方法
2)按声明顺序调用子类成员的初始化方法
3)调用子类构造方法

3.2构造器内部多态方法行为

1)构造器内部可以方式多态行为

2)类的初始化顺序对多态的影响

①先调用父类的构造方法,在父类的构造方法体中,发现方法被覆盖,调用覆盖的子类方法;
   (此时子类的成员并没有初始化,采用的是JVM给的默认值,引用类型默认是null)
②然后初始化子类属性成员,方法;
③最后调用子类的构造方法;

4、协变返回类型

不仅仅在参数列表中体现多态的应用,也可以在返回类型体现多态。

5、关于类型转换的异常

CastClassException类转型异常
编译器不仅编译器会检查类型转换,而且运行时也会检查,类型转换不正确就会出现CastClassException。

6、总结

多态意味着“不同的形式”,我们从父类继承而来的相同的接口,不同接口的具体实现的不同形式,不同版本的动态绑定方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值