Java.多态


概述

  • 多态性是指同一个操作作用于某一个对象时可以有不同的解释,产生不同的执行结果。

  • 多态存在的三个必要条件:

    • 需要存在继承实现关系
    • 方法的重写
    • 父类引用指向子类对象:Parent p = new Child()
  • 多态通过分离做什么和怎么做从一个角度实现了接口和实现进行分离,消除了类型之间耦合关系,提高了程序的拓展性和后期维护性。

  • 示例

    class Animal{
    	public String name;
    	
    	public void eat(){}
    }
    
    class Dog extends Animal{
    	public void eat(){
    		System.out.println("狗吃奥利给");
    	}
    }
    
    class Cat extends Animal{
    	public void eat(){
    		System.out.println("猫吃小老鼠");
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {
    		Animal dog = new Dog();
    		Animal cat = new Cat();
    		dog.eat();
    		cat.eat();
    	}
    }	
    
  • 输出

    狗吃奥利给
    猫吃小老鼠
    

对象的上下转型

  • 多态的转型分为向上转型向下转型两种。

向上转型

  • 多态本身就是向上转型过的过程,比如上面我们把狗类实例化时将其声明为了动物类,这就是向上转型,即从一个较专用类型转向一个较通用类型。
  • 向上转型时可能造成方法的丢失,当父类不存在子类的方法时则此方法不能再用。

向下转型

  • 跟向上转型相反的过程,将已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型

  • 强转是有风险的,我们使用instanceof关键字来判断左边的对象是否为右边的类的实例

  • 示例

    class Animal{
    	public String name;
    	
    	public void eat(){}
    }
    
    class Dog extends Animal{
    	public void eat(){
    		System.out.println("狗吃奥利给");
    	}
    }
    
    class Cat extends Animal{
    	public void eat(){
    		System.out.println("猫吃小老鼠");
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {
    		Animal dog = new Dog();
    		Animal cat = new Cat();
    		dog.eat();
    		
    		if(cat instanceof Cat){
    			Cat mimi =(Cat)cat;
    			mimi.eat();
    		}else{
    			System.out.println("cat不是Cat的对象");
    		}
    		
    	}
    }
    
    
  • 输出

    狗吃奥利给
    猫吃小老鼠
    

多态案例-打印机

  • 代码

    class School{
    	private Printer type;
    	
    	public void anZhuang(Printer type){
    		this.type = type;
    	}
    	public void print(String contex){
    		type.print(contex);
    	}
    }
    
    
    class Printer{
    	public String type;
    	public void print(String contex){}
    }
    
    class ColorPrinter extends Printer{
    	public void print(String contex){
    		System.out.println("彩色打印机打印:" + contex);
    	}
    }
    
    class BawDayin extends Printer{
    	public void print(String contex){
    		System.out.println("黑白打印机打印:" + contex);
    	}
    }
    
    class PinDayin extends Printer{
    	public void print(String contex){
    		System.out.println("针式打印机打印:" + contex);
    	}
    }
    
    public class Printor {
    	public static void main(String[] args) {
    				
    		School s = new School();
    		ColorPrinter c = new ColorPrinter();
    		s.anZhuang(c);
    		s.print("花花世界迷人眼,没有颜值别赛脸");
    		
    		BawDayin b = new BawDayin();
    		s.anZhuang(b);
    		s.print("刀不锋利马太瘦,你拿什么和我斗");
    		
    		PinDayin p = new PinDayin();
    		s.anZhuang(p);
    		s.print("辉煌岁月人人有,别把一刻当永久");
    	}
    }	
    
  • 输出

    彩色打印机打印:花花世界迷人眼,没有颜值别赛脸
    黑白打印机打印:刀不锋利马太瘦,你拿什么和我斗
    针式打印机打印:辉煌岁月人人有,别把一刻当永久
    

❤️ 本回完!❤️ ❤️ ❤️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

money的大雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值