面向对象的特征三:多态性
1、多态性指的是什么?多态性,可以理解为一个事物的多种表现形态。
1)方法的重载与重写 2)子类对象的多态性
2、子类对象使用多态性的前提:①要有继承②要有子类方法对父类的重写③父类的引用指向子类的对象。
3、程序运行分为编译状态和运行状态。
对多态性来说,编译时,“看左边”,将此引用变量理解为父类的类型。 运行时,“看右面”,关注于真正对象的实体:子类的对象。那么执行的对象就是子类的重写。
4、子类方法的多态性,并不适用于属性。是根据左边来确定的。 类属于重写或覆盖,所以调用的时候是调用子类的方法,而属性没有多态性,子类和父类同名的属性会同时存在,是调用左边即父类的属性。
public static void main(String[] args) {
Person p = new Person();
p.eat();
p.walk();
Man m = new Man();
m.eat();
m.walk();
//子类对象的多态性:父类的引用指向子类的对象。
Person p1 = new Man(); //向上转型man-->person
//虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父的方法。
p1.eat();//输出的是子类的信息
p1.walk();//输出的是子类的信息
p1.smoking();//错误,因为Person类中并没有Man类的方法。
}
p1.smoking();//错误,p1定义为person类,因为Person类中并没有Man类的方法,所以会出错。但是如果person类对象非要调用Man类的方法的话,则需要向下转型,将p1向下转型为Man类。
Man m = (Man) p1; //向下转型 person类-->man类
m.smoking(); //正确运行
基本数据类型的转型:向下转型 和 向上转型
较高级的基本数据类型---------->较低级的基本数据类型(基本类型转换)
较低级的基本数据类型---------->较高级的基本数据类型(强制类型转换)
父类(如Person)----->子类(如Man),向下转型,使用instanceof判断,Man m = (Man) p1, p1原先属于person类,使用强转符()
子类(如Man)----->父类(如Person),向上转型,Person p1 = new Man();
注:但是要把一个Man强制类型转换成一个Woman类型,编译时并不会报错,但是运行时会报错,类型转换错误(java.lang.ClassCastException)。
instanceof:
格式:对象a instanceof 类A,判断对象a是否属于类A的一个实例,若是,则返回true,否则返回false。 若对象a是A类的一个实例,那么也一定是A类的父类的实例。
if(p1 instanceof Woman){
Woman w1 =(Woman) p1;
w1.shopping();}
if(p1 instanceof Man){
Man m1 =(Man) p1;
m1.smoking();}