Java学习---多态(概念、对象上下转型、小应用)

本文介绍了Java中的多态性概念,包括其存在的必要条件和作用,并通过代码示例展示了多态的运用。同时,详细阐述了对象的上下转型,特别是向上转型的安全性以及如何使用instanceof进行类型检查。最后,通过一个实例说明了多态在实际应用中的价值,展示了如何利用多态实现不同类型的打印机接口统一管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、多态的概念

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

多态存在的三个必要条件
1.需要存在继承的和实现关系
2.同样的方法调用而执行不同的操作、运行不同的代码(重写)
3.在运行时父类或者接口的引用变量可以引用其子类的对象

多态的作用:
1.多态通过分离做什么和怎么做,总一个角度将接口和实现进行分离
2.多态消除了类型之间的耦合关系
3.多态的存在提高了程序的拓展性和后期的可维护性

代码示例:

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

class dog extends animal //需要存在继承的和实现关系
{
	public void eat() {  //同样的方法调用而执行不同的操作、运行不同的代码(重写)
		// TODO Auto-generated constructor stub
		System.out.println("狗吃骨头");
	}	
}

class cat extends animal //需要存在继承的和实现关系
{
	public void eat() { //同样的方法调用而执行不同的操作、运行不同的代码(重写)
		// TODO Auto-generated constructor stub
		System.out.println("猫吃鱼");
	}	
}
public class Test {
	public static void main(String[] args) {
		animal an1 = new dog();//在运行时父类或者接口的引用变量可以引用其子类的对象
		animal an2 = new cat();//在运行时父类或者接口的引用变量可以引用其子类的对象
		
		an1.eat();
		an2.eat();
	}
}

在这里插入图片描述

2、对象的上下转型

由子类转型成父类,在继承图上是向上移动的,一般称为向上转型
向上转型是从一个较专用类型像通用类型转换,所以总是安全的,也就是说,子类是父类的超集
向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法
与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)

instanceof运算符用来在运行时通过返回值来指出对象是否是特定类或者是它的子类的一个实例
用法:

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

说明:如果object是class或其子类的一个实例,则instanceof运算符返回true,如果不是或者object是null,则返回false

典型的使用场合:
在对对象做下转型之前,没有其他有关对象信息时务必使用instanceof来判断一下,以避免抛出ClassCastException异常

代码示例:

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

class dog extends animal
{
	public void eat() {
		// TODO Auto-generated constructor stub
		System.out.println("狗吃骨头");
	}	
}

class cat extends animal
{
	public void eat() {
		// TODO Auto-generated constructor stub
		System.out.println("猫吃鱼");
	}	
}
public class Test {
	public static void main(String[] args) {
		animal an1 = new dog();
		animal an2 = new cat();
		
		an1.eat();
		an2.eat();
		
		if (an2 instanceof cat){ //使用instanceof来判断一下,以避免抛出ClassCastException异常
			System.out.println("aa");
			cat cat = (cat)an2;
			cat.eat();
		}
	}
}

在这里插入图片描述

3、多态应用

彩色和黑白打印机都通过class Dayin来根据需求初始化,然后用school来使用

class school{
	public Dayin dayinji;
	public void anzhuang(Dayin dayinji){
		this.dayinji = dayinji;
	}
	public void print(String contex){
		dayinji.printf(contex);
	}
}

class Dayin{
	public void printf(String contex){
		
	}
}

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

class Heibai extends Dayin{
	public void printf(String contex){
		System.out.println("黑白打印"+contex);
	}
}
public class Test {
	public static void main(String[] args) {
		school s = new school();
		
		CaiShe c = new CaiShe();
		s.anzhuang(c);
		s.print("zheng");
		
		Heibai h = new Heibai();
		s.anzhuang(h);
		s.print("guan");
	}	
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值