Pet p = new Dog(); // p 就是引用变量
在java中多态的体现? --- 》 所谓多态,就是指一个引用变量在不同的情况下的多种表现状态。也可以理解为,多态是指通过指向父类的引用变量,来调用在不同子类中实现的方法。
注意:方法重写是实现多态的基础
一般用于继承体系下,子类重写父类的某个方法,调用时根据具体的子类实现去调用子类的方法
如果父类中有一个方法,每一个子类都有不同的实现,此时可以将这个方法声明为抽象方法,抽象方法是没有方法体的,只是一种规范。
Pet类中的toHospital() 方法不需要具体的实现,而且实现后没有任何意义,此时可以将Pet类中的toHospital()声明为抽象方法;
什么是抽象方法:被abstract修饰的方法,就是抽象方法。
1、抽象类为什么不能实例化
2、抽象类中是否可以存在构造方法?
3、抽象类和抽象方法的关系?
4、抽象类能不能继承普通类?
5、普通类能不能继承抽象类
6、抽象方法和普通方法的的区别!
语法:方法体,调用
特征:
1:抽象方法没有方法体,只有方法的声明;
2:如果一个类中存在抽象方法,那么这个类必须声明为抽象类;abstact修饰的类,抽象类不能创建对象
3:抽象类不能被实例化;
4:抽象方法必须在子类中被重写,除非子类也是抽象类;
如:
// 抽象类
public abstract class Pet{
//抽象方法
public abstract void toHospital();
}
4:向上转型
把子类对象直接赋给父类引用叫向上转型,向上转型不用强制转换。
<父类型> <引用变量名> = new <子类型>();
如:
Pet p = new Dog();
注意:
1、此时通过父类引用变量调用的方法是子类重写或继承父类的方法
2、此时通过父类引用变量无法调用子类特有的方法
5:向下转型 - 强制类型转换
向上转型只能使用子类重写的一些方法,和从父类中继承的一些方法,如何使用自己独有的一些方法呢?可以使用向下转型。
向下转型需要使用强制类型转换,调用子类特有的方法;
语法:
<子类型> <引用变量名> = (<子类型> )<父类型的引用变量>;
如:
Dog dog=(Dog)pet;//将pet 转换为Dog类型
dog.method();//执行Dog特有的方法
在进行向下转型的时候,非常容易发生类型转换异常,
ClassCastException --- 类型转换异常
instanceof用于判断一个引用类型所引用的对象是否是一个类的实例