当前位置: java社区 > 03-略知一二 > 阅读正文

java面向对象之多态

2021.8.24.   575 次   1019字

面向对象中的多态,理解为:

  • 一个对象拥有多种形态
  • 一个方法具有多种形态(方法的重载,覆盖)

这里,主要讲解对象的多态。

这里做一个简单的比喻:一个Student类继承了Human类,那么该Student可以是Student,也可以是Human,就有了2种形态,这就是对象的多态。

多态的前提

多态的前提,是继承或者实现接口。

多态的实现

多态的实现,依赖于转型。

可以向上转型,以及向下转型,即:灵活的转换身份。

多态的好处

多态提高了代码的可扩展性,

例如,公司有10万个员工,这里有一个员工类,而员工的工作各不相同,员工在工作时,有的是领导、有的是程序员、有的是清洁工,而在调度时,它们都是员工,参数的类型是相同的,所以调度起来很方便。

向上转型

这里把继承和接口分开讲解

继承中的向上转型

在继承中,子类转换为父类,例如以下语法

Human human = new Student();

在该语法中,new的是Student,但转换为Human,这让它看起来很奇怪,既不是完整的Student,也不是Human。

它最大的特点是:语法上是父类,如果它的方法被子类重写,那么优先使用重写后的方法。

因为语法是父类,那么无法使用子类特有方法,而属性无法被重写(即使同名重新赋值),所以属性仍是父类的属性。

如何使用子类的属性?向上转型后,如果子类属性重写了,需要使用子类属性,那么父类应该有getter/setter,以及子类重写getter/setter,那么此时就可以通过getter/setter使用子类的属性了。

接口的向上转型

接口不能直接创建,如果使用接口接收一个实现类,那么接口实际使用的是实现类的方法。

接口名称 对象名 =  new 实现类名称(参数);

向下转型

接口无法强转为实现类,即无法向下转型。

继承时,如果在 new 使用的是子类,但向上转为父类,此时才符合强转规则,强转为子类后,语法变为子类,使用起来和真实的子类语法一致。

instanceof关键字

使用语法:

对象 instanceof 类名

该关键字,能判断某个对象是否属于继承于某个类(包括它本类)的实例

在向下转型时,我们应该判断某个类本身是否属于它的子类。例如

System.out.println(human instanceof Student);  // true or false

假设human对象在 new 时,是Student,虽然向上转型为Human,但上述代码将输出true,所以这里我们可以使用instanceof判断能否向下转型。

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群