老王学JAVA七周第四天

对象的向上转型:
对象的向下转型
在这里插入图片描述

/*
抽象方法必须是抽象类: 记得要加abstract关键字。 
 */

public abstract class Animal {
	public abstract void eat();

}

public class Cat extends Animal{
	
	@Override
	public void eat(){
		System.out.println("猫吃鱼");
	}

	//子类特有方法
	public void catchMouse(){
		System.out.println("猫抓老鼠");
	}
}

public class Dog extends Animal{

	@Override
	public void eat() {
		System.out.println("狗吃SHIT");
	}
	
	public void watchHouse(){
		System.out.println("狗看家");
	}

}
/*
 向上转型一定是安全的,没有问题的,正确的,但是也有一个弊端,
 对象一旦向上转型为父类,就无法调用子类原本特意的方法内容。
 
 解决方案:用对象的向下转型[还原]。(本来就是猫才能还原才是猫)
 */
public class Demo01Main {

	public static void main(String[]args){
		//对象的向上转型,就是:父类引用指向子类对象。
		Animal animal = new Cat();//本来创建的时候是一种猫
		animal.eat();
		
		
//		animal.catchMouse();//错误写法
		
		//向下转型,进行“还原”动作
		Cat cat = (Cat) animal;
		cat.catchMouse();//猫抓老鼠
		
		//下面是错误的向下转型
		//本来new的时候是一只猫,现在非要当做狗
		//错误写法,编译不会报错,但是运行会出现异常;
		// java.lang.ClassCastException,类转换异常
		Dog dog = (Dog) animal;
	}
}

用instancesf 关键字进行类型判断:
如何能知道一个父类引用的对象,本来是什么子类?
格式:
对象 instanceof 类型名称
这将得到一个boolean值结果(判断boolean值 就是if语句),也就是判断前面的对象能不能当做后面类型的实列。

public class Demo02Instanceof {

	public static void main(String [] args){
		Animal animal = new Cat();//本来是一只猫
		animal.eat();//猫吃鱼
		
		//如果希望调用子类特有方法,需要向下转型
		//判断一下父类引用animal 本来是不是Dog
		if(animal instanceof Dog){
			Dog dog = (Dog) animal;
			dog.watchHouse();
		}
		//判断一下animal本来是不是Cat
		if(animal instanceof Cat){
			Cat cat = (Cat) animal;
			cat.catchMouse();
		}
		
		giveMeAPet(new Dog());
	}
	public static void giveMeAPet(Animal animal){
		if(animal instanceof Dog){
			Dog dog = (Dog) animal;
			dog.watchHouse();
		}
		if(animal instanceof Cat){
			Cat cat = (Cat) animal;
			cat.catchMouse();
		}
	}
}

笔记本USB接口案例 分析:
笔记本电脑:通常使用USB设备的功能,在生成时,笔记本都有预留了可以插入USB设备的USB接口,具体是什么USB设备,笔记本厂商并不关心,只要符合USB规格的设备都可以。

定义USB 接口,具备最基本的开启功能和关闭功能,鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,实现USB接口,否则鼠标和键盘的生产出来也无法使用。

案例分析:
进行描述笔记本类,实现笔记本使用USB鼠标,USB 键盘。
1,USB接口,包含打开设备功能,关闭设备功能
2,笔记本类,包含开机功能,关机功能,使用USB设备功能。
3,鼠标类,要实现USB接口,并具备点击的方法
4,键盘类,要实现USB接口,具备敲击的方法。

在这里插入图片描述

public interface USB {
	
	
	public abstract void open();//打开设备
	
	
	public abstract void close();//关闭设备

}
public class Computer {
	
	public void  powerOn(){
		System.out.println("笔记本电脑开机");
		
	}
	public void powerOff(){
		System.out.println("笔记本电脑关机");
	}
	
	//使用USB 设备的方法,使用接口作为方法的参数
	public void useDevice(USB usb){
		usb.open();//打开设备
		if(usb instanceof Mouse){//一定先判断
			Mouse mouse = (Mouse) usb;//向下转型
			mouse.click();
		}else if (usb instanceof Keyboard){//先判断
			Keyboard keyboard = (Keyboard) usb;//向下转型
			keyboard.type();
		}
		
		usb.close();//关闭设备
	}

}

//鼠标就是一种USB设备
public class Mouse implements USB{

	@Override
	public void open() {
		System.out.println("打开鼠标");
		
	}

	@Override
	public void close() {
		System.out.println("关闭鼠标");
		
	}

	public void click(){
		System.out.println("点击鼠标");
	}
}

//键盘也是一个USB设备
public class Keyboard implements USB {

	@Override
	public void open() {
		System.out.println("打开键盘");
		
	}

	@Override
	public void close() {
		System.out.println("关闭键盘");
		
	}

	public void type(){
		System.out.println("键盘输入");
	}
}

public class DemoMain {

	public static void main(String[]args){
		
		//首先创建一个笔记本电脑
		Computer computer = new Computer();
		computer.powerOn();
		
		//准备一个鼠标,供电脑使用
//		Mouse mouse = new Mouse();
		//首先进行向上转型
		USB usbMouse = new Mouse();//多态写法
		//参数是USB 类型,我正好传递进去的就是USB鼠标
		computer.useDevice(usbMouse);
		
		
		
	//创建一个USB 键盘 
		Keyboard keyboard = new Keyboard();//没有使用多态写法
		//方法参数是USB类型,传递进去的是实现类对象
		computer.useDevice(keyboard);//正确写法,也发生了向上转型
		//使用子类对象,匿名对象,也可以
//		computer.useDevice(new Keyboard());//也是正确写法
		
		
		
		computer.powerOff();
		System.out.println("=================");
		
		method(10.0);//正确写法。double --> double
		method(20);//正确写法。 int --> double
		
		int a = 30;
		method(a);//正确写法, int -- > double
			
	}
	
	public static void method(double num){
		System.out.println(num);
	}
}

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值