为什么使用多态?实现多态的有哪些方式?

为什么使用多态?实现多态的有哪些方式?

实现多态的两种方式

一、什么是多态?

父类类型的变量指向子类创建的对象,使用该变量调用父类中一个被子类重写的方法,则父类中的方法呈现出不同的行为特征,这就是多态。

简单的来说编译时方法行为表现的是父类中的方法,运行时方法行为表现的是子类中重写该方法的行为特征

二、为什么使用多态?

1、实现代码的复用,避免代码的冗余;

2、减少代码之间的关联性,即耦合度,方便后期对代码的修改,功能的改善,不必牵一发而动全身,减少不必要的麻烦;

3、能够通过重写子类的方法,使不同的对像具有不同的功能,扩展了功能。

3、举例说明

//哺乳类

piublic class Mammal

public void move(){

System.out.println("会移动!");

}

}

//鲸鱼类

public class Whale extends Mammal{

public void move() {

System.out.println("靠鱼鳍移动!");

}

}

//蝙蝠类

public class Bat extends Mammal{

public void move() {

System.out.println("靠翼移动!");

}

}

//如果有很多个哺乳类动物的话,每一次都要重新定义一个move方法,很麻烦且代码冗余影响运行的速度

public class Main{

public static void main(String[] args) {

Whale whale = new Whale();

whale.move();

Bat bat = new Bat();

bat.move();

}

}

//我们可以这样修改

public class Main{

public static void main(String[] args) {

Mammal mammal1 = new Whale();//使用上转型每次只需要重写子类的方法就可以,不需要重新定义方法

Mammal mammal2 = new Bat();

mammal1.move();

mammal2.move();

}

}

三、多态的实现方式

1、上转型对象实现多态

1.1、上转型对象与下转型对象

上转型对象:子类创建的对象赋值给父类声明变量,则该对象称为上转型对象,这个过程称为对象上转型,对应于 数据类型转换中的自动类型转换;

下转型对象:上转型对象再强制转换为创建该对象的子类类型的对象,即将上转型对象还原为子类对象,对应于数 据类型转换中的强制类型转换。

注意:①上转型对象才能够对象下转型;

public class Test {

public static void main(String[] args) {

Mammal mammal = new Whale();//下转型对象

Whale whale =(Whale) mammal;//下转型对象,还原为鲸鱼类

}

}

②上转型对象不能操作子类新增的成员变量,不能调用子类新增的方法,因此如果要使用子类新增的属性 必须下转型

1.2、上转型对象实现多态实例

//哺乳类(父类)

public class Mammal{

public void move(){

System.out.println("移动");

}

}

//鲸鱼类(继承自哺乳类)

public class Whale extends Mammal{

public void move(){

System.out.println("靠鱼鳍移动");

}

}

//测试类

public class Test {

public static void main(String[] args) {

Mammal mammal = new Whale();//上转型对象,父类类型的变量指向子类声明的对象

mammal.move();

}

}

运行结果:运行结果表现出来的是Mammal里move方法的行为特征,编译时表现为父类的move方法的行为特征 ,多种行为状态,即为 多态

2、接口回调实现多态

2.1、什么是接口回调?

接口回调描述的是一种现象:接口声明的变量指向其实现类实例化的对象,那么该接口变量就可以调用接口中的抽象方法,

编译时方法行为表现的是接口中的抽象方法,运行时方法行为表现的是接口实现类中重写该方法的行为特征,即为多态

2.2、接口回调实现多态实例

//接口

public interface IMammal {

void move();

}

public class Whale implements IMammal{

public void move(){

System.out.println("靠鱼鳍移动");

}

}

public class Test {

public static void main(String[] args) {

IMammal mammal = new Whale();

mammal.move();

}

}

运行结果:编译时是接口的行为特征,运行时是接口实现类的行为特征

3、接口回调与上转型对象实现多态的区别与联系

①上转型对象多态的父类是普通类,接口回调都是父类是接口;

②接口回调父类方法更加的简洁,是抽象方法不需要有方法体;

③都是编译时显示父类方法行为特征,运行时显示子类行为特征。

相关推荐