Java之多态

本文深入探讨了Java中的多态性概念,包括其存在的必要条件和作用。通过实例展示了如何通过向上转型和向下转型实现多态,并通过代码演示了多态在实际编程中的应用,如打印机类的抽象和具体实现。多态增强了程序的灵活性和可扩展性。
摘要由CSDN通过智能技术生成

多态的概念

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

多态存在的三个必要条件

需要存在继承和实现关系
同样的方法调用而执行不同操作、运行不同代码(重写)
在运行时父类或者接口的引用变量可以引用其子类的对象多态的作用
多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离
多态消除了类型之间的耦合关系
多态的存在提高了程序的拓展性和后期的可维护性
测试用例

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 an1 = new Dog();
		Animal an2 = new Cat();
		
		an1.eat();
		an2.eat();
	}
}

运行结果

狗啃骨头
猫吃鱼

对象的上下转型

由于子类转型成父类,在继承图上是向上移动的,一般称为向上转型
向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集
向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
与之相反的操作是向下转型,不安全(可能需要 instanceof 操作符协助)
instanceof 运算符用来在运行时通过返回值来指出对象是否是特定类或者是它的子类的一个实例
用法

result = object instanceof class
result:布尔类型
object:必选项,任意对象表达式
class:必选项,任意已定义的对象类

说明:如果 objectclass 或其子类的一个实例,则 instanceof 运算符返回 true ,如果不是 或者 objectnull,则返回 false
典型的使用场合
在对对象做下转型之前,没有其他有关对象信息时务必使用 instanceof 来判断一下,以避免抛出 ClfassCastException 异常。
巧记
向上转型:子类强转成父类(猫是动物);
向下转型:父类强转成子类(动物是猫,必须是猫的动物才能是猫才可以转型);
测试用例

class Animal{
	public String name;
	public void eat(){};
}

class Dog extends Animal{
	public void eat(){
		System.out.println("狗啃骨头");
	}
	public void sleep(){
		System.out.println("狗睡觉");
	}
}

class Cat extends Animal{
	public void eat(){
		System.out.println("猫吃鱼");
	}
}
public class Test {
	public static void main(String[] args) {
		Animal an1 = new Dog();
		Animal an2 = new Cat();
		Dog dog = new Dog();
		
		an1.eat();
		//an1.sleep();//向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
		dog.sleep();
		an2.eat();
		if(an2 instanceof Cat){
			System.out.println("aa");
			Cat cat = (Cat)an2;//向下转型
			cat.eat();
		}
	}
}

运行结果

狗啃骨头
狗睡觉
猫吃鱼
aa
猫吃鱼

多态应用

简单来说,多态是具有表现多种形式能力的特征
同一个实现接口,使用不同的实例而执行不同操作

class School{
	public Dayin dayinji;
	
	public void anZhuangC(Dayin dayinji){
		this.dayinji = dayinji;
	}
	
	public void print(String contex){
		dayinji.print(contex);
	}
}

class Dayin{
	public String pinpai;
	public void print(String contex){
		
	}
}

class CaiSeDayin extends Dayin{
	public void print(String contex){
		System.out.println("彩色打印机打印"+contex);
	}
}

class HeiBaiDayin extends Dayin{
	public void print(String contex){
		System.out.println("黑白打印机打印"+contex);
	}
}

class ZhensDayin extends Dayin{
	public void print(String contex){
		System.out.println("针式打印机打印"+contex);
	}
}

public class Test {
	public static void main(String[] args) {
		School s = new School();
		CaiSeDayin c = new CaiSeDayin();
		s.anZhuangC(c);
		s.print("hello");
		
		HeiBaiDayin h = new HeiBaiDayin();
		s.anZhuangC(h);
		s.print("world");
		
		ZhensDayin z = new ZhensDayin();
		s.anZhuangC(z);
		s.print("!!!");
	}
}
彩色打印机打印hello
黑白打印机打印world
针式打印机打印!!!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

从入门到捕蛇者说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值