父类引用指向子类对象中,若要调用子类独有的方法需要使用向下转型来强制类型转换为子类引用。
举例:
//父接口 USB接口
public interface USB{
void service();
}
//子实现类优盘类 实现usb接口
public class UDisk implements USB{
//子类实现父接口的方法
public void service(){
System.out.println(“优盘开始传输数据……”);
}
//子类独有方法
public void show(){
System.out.println(“我是一个优盘”);
}
}
//子实现类鼠标类 实现usb接口
public class Mouse implements USB{
//子类实现父接口的方法
public void service(){
System.out.println(“鼠标开始工作……”);
}
//子类独有方法
public void showInfo(){
System.out.println(“我是一个鼠标”);
}
}
public class Test{
//返回父类引用
public USB getDistance(int num){
USB usb;
if(num==1){
usb = new UDisk();
}else{
usb = new Mouse();
}
return usb;
}
public static void main(String[] args){
Test test = new Test();
USB usb = test.getDistance(1);
//此时拿到了指向UDisk对象的父类引用,但这个时候usb不能调用子类独有的方法,需要强制类型转化
if(usb instanceof UDisk){
//说明是优盘
UDisk uDisk = (UDisk)usb;//强制类型转换后,指明是一个优盘,这时可以调用子类独有的方法
uDisk.show();
}else{
//说明是鼠标
……
}
}
}
说明:
初学者在初学多态时不容易理解向上转型和向下转型。向下转型可以这样理解:
调用Test类的getDistance(1)方法后,返回的是一个装在盒子里的优盘,这个时候你只能看到一个盒子,里面装的是优盘还是鼠标你看不见,使用x光照一下盒子(使用instanceof确定是优盘还是鼠标),这个时候确定是什么后在盒子上写上是优盘还是鼠标,别人就能够知道了。
图片上红笔圈起来的子类就相当于在盒子上写上名字,然后能确定是什么类型的数据后,在等号前面接收一下,就完成了向下转型(强制类型转换)