转型的过程中,一不小心会遇到这样的问题;
public class blcakbood { public static void main(String[] args) { //向上转型 Animal a=new Cat; a.eat; //调用的是Cat的eat //向下转型 Dog d=(Dog)a; d.watchHouse; //调用的是Dog的watchHouse【运行报错】 } }
这段代码可以通过编译,但是运行时,却报出了类型转换异常!这是因为,明明创建了
Cat类型对象,运行时,当然不能转换成Dog对象的。这两个类型并没有任何继承关系,不符合类型转换的定义。
为了避免ClassCastException的发生,Java提供了instanceof 关键字,给引用变量做类型的校验,格式如下:
变量名 instanceof 数据类型
如果变量属于改数据类型,返回true;
如果变量不属于该数据类型,返回false
小练习:
进行描述笔记本电脑类,实现笔记本使用USB鼠标,USB键盘 USB接口,包含开启功能,open功能 close关闭功能 笔记本类,包含运行功能run,关机功能shutdow,使用USB设备功能useUSB 鼠标类,要实现USB接口,并具备点击的方法click 键盘类,要实现USB接口,具备敲击的方法type
//先定义一个USB接口
package Day01; /** * @Author liaodaijiayue * @Date 2022/4/8 22:30 * @Version 1.0 */ /* 进行描述笔记本电脑类,实现笔记本使用USB鼠标,USB键盘 USB接口,包含开启功能,open功能 close关闭功能 笔记本类,包含运行功能run,关机功能shutdow,使用USB设备功能useUSB 鼠标类,要实现USB接口,并具备点击的方法click 键盘类,要实现USB接口,具备敲击的方法type */ public interface USB { void open();//开启功能 void close();//关闭功能 }
//定义mouth类(单词将错就错吧)
package Day01; /** * @Author liaodaijiayue * @Date 2022/4/8 22:21 * @Version 1.0 */ public class Mouth implements USB{ @Override public void open() { System.out.println("开始使用鼠标......."); } @Override public void close() { System.out.println("鼠标使用完毕......."); } //鼠标具备点击的功能 public void click(){ System.out.println("正在使用鼠标......."); } }
//定义键盘类
package Day01; /** * @Author liaodaijiayue * @Date 2022/4/8 22:38 * @Version 1.0 */ 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("键盘正在被敲击......"); } }
//定义笔记本类
package Day01; import java.awt.event.KeyEvent; /** * @Author liaodaijiayue * @Date 2022/4/8 22:41 * @Version 1.0 */ public class NodeBook { //首先电脑具备运行功能 public void run(){ } //需要使用usb 调用父类接口 public void useUSB(USB usb){ usb.open(); //不知道使用的是键盘还是鼠标 这个时候需要判断 if(usb instanceof Mouth){ //如果使用的是鼠标 Mouth mouse=(Mouth)usb; mouse.click(); } if(usb instanceof Keyboard){ //使用的是键盘 Keyboard keyboard=(Keyboard)usb; keyboard.type(); } usb.close(); } }
//最后是测试类
package Day01; /** * @Author liaodaijiayue * @Date 2022/4/8 22:41 * @Version 1.0 */ /* 进行描述笔记本电脑类,实现笔记本使用USB鼠标,USB键盘 USB接口,包含开启功能,open功能 close关闭功能 笔记本类,包含运行功能run,关机功能shutdow,使用USB设备功能useUSB 鼠标类,要实现USB接口,并具备点击的方法click 键盘类,要实现USB接口,具备敲击的方法type */ public class Text { public static void main(String[] args) { NodeBook nodeBook = new NodeBook(); nodeBook.run(); USB usb1= new Mouth(); nodeBook.useUSB(usb1); USB usb2=new Keyboard(); nodeBook.useUSB(usb2); } }
//运行结果显示