1、对象的向上转型与向下转型
-
向上转型
对象的向上转型就是多态的写法:
格式: 父类名称 对象名 = new 子类名称();
含义:右侧创建一个子类对象,把他当做父类来看待,比如:创建了一只猫,当做动物来看待。
注意:向上转型一定是安全的,从小范围转到大范围,
类似于:自动类型转化;
代码 实现:
package Interface.demo6; /* * 动物类 * * */ public abstract class Animal { public abstract void eat(); }
package Interface.demo6; /* * 猫类。继承Animal类 * 并重写了父类中的方法 * */ public class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼"); } }
package Interface.demo6; /* * 测试类 * */ public class Demo01Main { public static void main(String[] args) { //父类对象指向子类对象的引用 Animal animal = new Cat(); animal.eat(); } }
-
向下转型
作用:实例化的类向上转型后,如果想访问子类的成员方法或成员变量,就会无法访问,通过向下转型后,就可以访问。
对象的向下转型其实就是一个还原动作,
格式:子类的名称 对象名 = (子类名称)父类对象;
含义:将父类对象 【还原】成本类的子类对象。
Animal animal = new Cat(); //本来是猫,向上转型为动物,
Cat cat = (Cat) animal; //本来是猫,向上转型为动物,还原回来成为本来的猫,
注意:
- 必须保证对象创建是,与还原是的类型是一致的,例如:猫还原为猫,够还原为狗
- 如果对象创建时候本来不是猫,现在非要还原为猫,就会报运行时错误:ClassCastException,表示:类型转化错误。
类似于:基本数据类型的强制类型转化
package Interface.demo6; /* * 动物类 * * */ public abstract class Animal { public abstract void eat(); }
package Interface.demo6; /* * 猫类。继承Animal类 * 并重写了父类中的方法 * */ public class Cat extends Animal { @Override public void eat() { System.out.println("猫吃鱼"); } public void catchMouse(){ System.out.println("猫抓老鼠"); } }
package Interface.demo6; /* * 测试类 * */ public class Demo01Main { public static void main(String[] args) { //父类对象指向子类对象的引用 Animal animal = new Cat(); animal.eat(); //向下转型,将animal类转化为猫类 Cat cat = (Cat) animal; cat.catchMouse(); } }
猫吃鱼
猫抓老鼠
2、instanceof方法
instanceof可以判断引用类型的变量是否属于这个类型
package Interface.demo6;
/*
* 测试类
* */
public class Demo01Main {
public static void main(String[] args) {
//父类对象指向子类对象的引用
Animal animal = new Cat();
animal.eat();
//向下转型,将animal类转化为猫类
// Cat cat = (Cat) animal;
// cat.catchMouse();
}
public static void getAnPet(Animal animal){
if(animal instanceof Cat){
//向下转型
Cat cat = (Cat) animal;
cat.catchMouse();
}else {
System.out.println("没有其他类");
}
}
}
记住:instanceof 在向下转型是判断要转的这个类属于那个类,这个类与他的向上转型的类一致
3、笔记本usb接口案例
package Interface.demo7;
/*
* 笔记本类
* */
public class Computer {
//打开电脑
public void powerOn(){
System.out.println("打开电脑");
}
public void powerOff(){
System.out.println("关闭电脑");
}
public void useDrivce(Usb usb){
//打开设备
usb.open();
//使用向下转型
if (usb instanceof Mouse) {
Mouse mouse = (Mouse) usb;
mouse.type();
}else if (usb instanceof Keyboard){
Keyboard keyboard = (Keyboard) usb;
keyboard.type();
}
//关闭设备
usb.close();
}
}
package Interface.demo7;
/*
* usb接口
* */
public interface Usb {
//打开设备
public abstract void open();
//关闭设备
public abstract void close();
}
package Interface.demo7;
/*
* 鼠标类
* */
public class Mouse implements Usb {
//使用鼠标的方法
@Override
public void open() {
System.out.println("打开鼠标");
}
@Override
public void close() {
System.out.println("关闭鼠标");
}
public void type(){
System.out.println("鼠标点击");
}
}
package Interface.demo7;
/*
* 键盘类
* */
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 Interface.demo7;
/*
* 测试类
* */
public class demoMain {
public static void main(String[] args) {
//创建一个电脑
Computer computer = new Computer();
//打开电脑
computer.powerOn();
//创建一个鼠标
Usb mouseUsb = new Mouse();
computer.useDrivce(mouseUsb);
//创建一个键盘
Usb keyBoardUsb = new Keyboard();
computer.useDrivce(keyBoardUsb);
//关闭电脑
computer.powerOff();
}
}
打开电脑
打开鼠标
鼠标点击
关闭鼠标
打开键盘
键盘输入
关闭键盘
关闭电脑