Java学习第十二天之多态的概念和案例实现以及多态重上下转型需要注意的点

本文探讨了多态的概念,如何通过继承和重写实现多态,以及对象的向上转型(从子类到父类)和向下转型的特性。通过实例展示了如何在Java中使用Benz和Bmw类进行操作,并介绍了instanceof在转型中的应用,以及Liskov替换原则。

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

一、多态的概念

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

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

·需要存在继承和实现关系。     

·同样的方法调用而执行不同操作、运行不同代码(重写)。     

·在运行时父类或者接口的引用变量可以引用其子类的对象多态的作用。

多态的作用: 

·多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离。

·多态消除了类型之间的耦合关系。     

·多态的存在提高了程序的拓展性和后期的可维护性。


范例:

package 多态入门;

abstract class Manufacturer{
	abstract  public void Maker();
}
class Benz extends Manufacturer{
	  public void Maker()
	  {
		 System.out.println("造一辆进口梅赛德斯奔驰");
		 System.out.println("E300  Coupe");
	  }
	  public void mostMaker()
	  {
		   System.out.println("造一辆迈巴赫s480!");
	  }
}
class Bmw extends Manufacturer{
	  public void Maker()
	  {
		  System.out.println("造一辆进口宝马");
		  System.out.println("IM 540i");
	  }
	  
}
public class Test {
public static void main(String[] args) {
	Manufacturer M = new Benz();
	M.Maker();
	//M.mostMaker();
	Manufacturer B = new Bmw();
	B.Maker();
	//Benz MMM = new Benz();
	//MMM.mostMaker();
	//Bmw bmw = (Bmw)M;
	//bmw.Maker();
	
}
}

输出结果:

造一辆进口梅赛德斯奔驰:
E300  Coupe
造一辆进口宝马
IM 540i

二、对象的上下转型

·由子类转型成父类,在继承图上是向上移动的,一般称为向上转型。

·向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集。

·向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法。

·与之相反的操作是向下转型,不安全(可能需要instanceof操作符协助)。

·LSP(liskov替换原则):子类型必须能够替换掉他们的基类型 ·安全的上转型和LSP的实施,充分体现继承的ls-a关系。

范例承上:

因为我在父类中并没有定义mostMaker这个函数,所以在使用父类调用中系统会报错。

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

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

范例承上:

输出结果:

造一辆进口梅赛德斯奔驰
E300  Coupe
造一辆进口宝马
IM 540i
造一辆迈巴赫s480!
Exception in thread "main" java.lang.ClassCastException: class 多态入门.Benz cannot be cast to class 多态入门.Bmw (多态入门.Benz and 多态入门.Bmw are in unnamed module of loader 'app')
at 多态入门.Test.main(Test.java:34)

虽然程序没有报错,但是这种强制转化方法并不可用。

非要进行强制转化,要用到上面提到的instanceof运算符

范例:

public static void main(String[] args) {
	Manufacturer M = new Benz();
	M.Maker();
	//M.mostMaker();
	Manufacturer B = new Bmw();
	B.Maker();
	Benz MMM = new Benz();
	MMM.mostMaker();
	if(B instanceof Bmw)
	{	
		System.out. println("坐Benz 开BMW");
		Bmw bmw = (Bmw)B;
	    bmw.Maker();
	}
	
}
}

输出结果:

造一辆进口梅赛德斯奔驰
E300  Coupe
造一辆进口宝马
IM 540i
造一辆迈巴赫s480!
坐Benz 开BMW
造一辆进口宝马
IM 540i
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小秦要变强

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

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

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

打赏作者

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

抵扣说明:

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

余额充值