多态
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
public class Test {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入: 1.国内订单 2.国外订单");
OrderService orderService=null;
int choice=sc.nextInt();
switch(choice){
case 1:
// 创建国内订单的业务类
orderService=new OrderServiceImpl();
break;
case 2:
// 创建国外订单的业务类
orderService=newOverseasServiceImpl();
break;
}
orderService.create();
orderService.findne();
orderService.findList();
orderService.cancel();
orderService.finish();
orderService.paid();
}
}
输出结果
请输入: 1.国内订单 2.国外订单
1
创建订单
查询单个订单
查询订单列表
取消订单
完结订单
支付订单
请输入: 1.国内订单 2国外订单
2
国外业务 --- 创建订单
国外业务---查询单个订单
国外业务--- 查询订单列表
国外业务---取消订单
国外业务---完结订单
国外业务---支付订单
多态前提
1.有继承/实现关系
2.有方法重写
3.有父类引用指向子类对象
对象多态
Animal a1=new Dog();
Animal a2 =new Cat();
好处:方法的形参定义为父类类型,这个方法就可以接收到该父类的任意子类对象了
例:
public static void main(String[] args){
Animal a1=new Dog();
Animal a2=new Cat();
useAnimal(new Dog());
useAnimal(new Cat());
}
public static void useAnimal(Animal a){ // Animal a=new Dog();
// Animal a =new Cat();
}
行为多态
好处:同一个方法,具有多种不同表现形式,或形态的能力
public static void main(String[] args){
// useAnimal(new Dog());
useAnimal(new Cat());
public static void useAnimal(Animala){ // Animal a =new Dog();
a.eat(); // Animal a =new Cat();
}
输出:猫吃鱼
public static void main(String[] args){
useAnimal(new Dog());
//useAnimal(new Cat());
public static void useAnimal(Animala){ // Animal a =new Dog();
a.eat(); // Animal a =new Cat();
}
输出:狗吃肉
多态的成员访问特点
1.成员变量 :编译看左边(父类),运行看左边(父类)
2.成员方法 :编译看左边(父类),运行看右边(子类)
在编译的时候,会检查父类中有没有这个方法
没有 :编译出错
有 :编译通过,但是运行的时候,一定会执行子类的方法逻辑
原因:担心你调用的方法,在父类中是一个抽象方法
多态创建对象,调用静态成员 :
静态的成员,推荐类名进行调用
细节:静态的成员,可以使用对象名调用,但这是一种假象
-生成字节码文件后,会自动将对象名调用,改成类名调用
多态的好处和弊端
多态的好处:提高了程序的扩展性
对象多态:将方法的形参定义为父类类型 这个方法可以接收该父类的任意子类对象
多态的弊端:不能使用子类的特有成员
多态中的转型
向上转型
从子到父(父类引用指向子类对象)
Fu f = new Zi();
向下转型
从父到子(将父类引用所指向的对象,转交给子类类型)
Zi z=(Zi)f;
概述:如果被转的引用类型变量,对应的实际关类型和目标类型不是同一种类型,那么在转换的时候就会出现ClassCastException
解决方案:
关键字 instanceof的使用格式:
对象名instanceof类型
判断一个对象是否是一个类的实例
通俗的理解:判断关键字左边的对象,是否是右边的类型,返回boolean类型结果