员工:work();//抽象
extends或implements
讲师类:work(){讲课} 助教类:work(){辅导}
如果不用多态,只用子类,那么写法是:
【Teacher】 one = new Teacher();
one.work();//讲课
【Assistant】 two = new Assistant();
two.work();//辅导
我现在唯一要做的事情,就是调用work方法,其他的功能不关心。
如果使用多态的写法,对比一下:
【Employee】 one = new Teacher();
one.work();//讲课
【Employee】 two = new Assistant();
two.work();//辅导
好处:无论右边new的时候换成哪个子类对象,等号左边调用方法都不会变化。
对象的上下转型
动物:eat();//抽象
猫:eat(){鱼}
狗:eat(){SHIT}
1. 对象的向上转型,其实就是多态写法:
【格式:父类名称 对象名 = new 子类名称();】 Animal animal = new Cat();
含义:右侧创建了一个子类对象,把它当作父类来看待使用。 创建了一直猫,当作动物看待,没问题。
注意事项:【向上转型一定是安全的】。从小范围转向了大范围,从小范围的猫,向上转换成为了更大范围的动物。
类似于:
double num = 100;//正确,int --> double,自动类型转换。
2. 对象的向下转型,其实就是一个【还原】的动作。
【格式:子类名称 对象名 =(子类名称) 父类对象;】
含义:将父类对象,【还原】成为本来的子类对象。
Animal animal = new Cat();//本来是猫,向上转型成为动物
Cat cat=(Cat) animal;//本来是猫,已经被当作动物了,还原回来成为本来的猫
【注意事项】:
a. 必须保证对象本来创建的时候,就是猫,才能向下转型成为猫。 本来是猫,还原为猫
b. 如果对象创建的时候本来不是猫,现在非要向下转型成为猫,编译不会报错,但是运行会出现异常。【java.lang.ClassCastException 类转换异常】 本来是猫,当作狗,错误!
类似于:int num =(int) 10.0;//可以 int num =(int) 10.5;//不可以,精度损失
instanceof关键字
向上转型一定是安全的,没有问题的,正确的。但是也有一个弊端:
对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。
解决方案:用对象的向下转型【还原】。
如何才能知道一个父类引用的对象,本来是什么子类?
格式:
对象 instanceof 类名称
这将会得到一个boolean值结果,也就是判断前面的对象能不能当作后面类型的实例。
例如: Animal animal = new Dog();//本来是一只狗
if(animal instanceof Dog){
Dog dog =(Dog) animal;
dog.watchHouse();}
// 如果希望调用子类特有方法,需要向下转型
// 判断一下父类引用animal本来是不是Dog
public interface USB {
public abstract void open();//打开设备
public abstract void close();//关闭设备
}
鼠标类 鼠标就是一个USB设备
public class Mouse implements USB{
// 覆盖重写USB接口中的全部抽象方法
@Override
public void open(){
System.out.println("打开鼠标");}
@Override
public void close(){
System.out.println("关闭鼠标");}
public void click(){
System.out.println("鼠标点击");}}
使用多态的好处员工:work();//抽象extends或implements讲师类:work() {讲课} 助教类:work() {辅导}如果不用多态,只用子类,那么写法是:【Teacher】 one = new Teacher();one.work();//讲课【Assistant】 two = new Assistant();two.work();//辅导我现在唯一要做的事情,就是调用work方法,其他的功能不关心。如果使用多态的写法,对比一下:【Employee】 on