多态的两种实现方式
1 使用父类作为方法形参
2 使用父类作为方法返回值
(注: 当作为参数的父类是普通类或者抽象类时,构成继承多态; 当作为参数的父类是一个接口时,构成接口多态)
1、使用父类方法作为形参( 形式参数的类型: ①基本类型 ②引用类型 )
普通类形参: 当一个形参希望我们传入的是一个普通类时,我们实际上传入的是该类的对象/匿名对象
抽象类形参: 当一个形参希望我们传入的是一个抽象类时,我们实际上传入的是该类的子类对象或子类匿名对象
接 口 形 参 : 当一个形参希望我们传入的是一个接口时,我们实际上传入的是该类的实现类对象或实现类匿名对象
注 意 : 当一个方法的形参是引用类型的时候,需做非空判断,以免出现类型转换异常
2、 使用父类方法作为返回值( 返回值的类型: ①基本类型 ②引用类型 )
普通类: 当一个方法的返回值是一个普通的类时,实际上返回的是该类的对象,我们可以使用该类的对象接收
抽象类: 当一个方法的返回值是一个抽象类时,实际上返回的是该抽象类的子类对象,我们可以使用该抽象类接收
接 口: 当一个方法的返回值是一个接口时,实际上返回的是该接口的实现类对象,我们可以使用接口接收
(注:当方法的返回值类型是引用类型的时候,可以使用链式调用)
3、 代码演示
public class Polymorphism {
public static void main(String[] args) {
}
}
interface Ivehicle {
public abstract void run();
public abstract void show();
}
abstract class AbsTool {
abstract void absmethod();
}
class Car extends AbsTool implements Ivehicle {
public void absmethod() {
System.out.println("实现父类抽象方法");
}
public void run() {
System.out.println("实现接口的run方法");
}
public void show() {
System.out.println("实现接口的show方法");
}
// 抽象类AbsTool作为形参,传入的实参应是其(匿名)子类Car的(匿名)对象:new car();
public void method1(AbsTool s) {
System.out.println("使用抽象类作为形参");
}
// 接口Ivehicle作为形参,传入的实参应是其实现类Car的(匿名)对象:new car();
public void method2(Ivehicle s) {
System.out.println("使用接口作为形参");
}
// 抽象类AbsTool作为返回值类型,返回的应是其子类Car的(匿名)对象:new car();
public AbsTool method3() {
System.out.println("返回AbsTool类的子类对象");
return new Car();
}
// 接口Ivehicle作为返回值类型,返回的应是其实现类Car的(匿名)对象:new car();
public void method4(Ivehicle s) {
System.out.println("使用接口作为形参");
}
}
class Bmw extends Car {
// 普通类Car作为形参,那么应传入的实参是该普通类Car的对象,例如:new car();
public void method5(Car s) {
}
// 普通类Car作为返回值类型,返回应是该普通类Car的对象,例如:new car();
public Car method6() {
return new Car();
}
}