一、多态性的理解
一个事物的多种形态。
二、对象的多态性
父类的引用指向子类的对象。
例如:
Person p = new Man();//Man是Person的子类
Object obj = new Date();
说明:
Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边;运行时,看右边。如果编译时的类型和运行时的类型不一致,就出现了对象的多态性。
举例:
public class test { public static void main(String[] args) { Animal animal = new Cat(); //实际执行的是子类重写后的eat() animal.eat(); } } class Animal{ String name; int age; public void eat(){ System.out.println("动物进食"); } } class Cat extends Animal{ public void eat(){ String ability; System.out.println("猫类进食"); } }
三、虚拟方法调用
子类继承父类以后,对父类中的方法进行类重写。实例化父类的引用执行子类的对象(多态性),在编译器,只能调用父类中声明的方法,但是在运行期,实际执行的是子类重写父类的方法。
四、多态性使用的前提
①子父类继承关系;
②子类重写父类的方法;
注意:
多态性的使用仅适用于方法,不适用于属性。
五、动态绑定
编译时看左边,运行时看右边。
六、向上转型和向下转型
1.向上转型:多态性
2.向下转型
问题的引入:
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。如何才能调用子类特的属性和方法?使用向下转型。
如何实现向下转型?
使用强制类型转换符:()
七、instanceof的使用
在使用向下转型的过程中,可能出现ClassCastException的异常。因此,在进行强转之前,要使用instanceof判断某个对象是否是某个类的实例。如果返回true,就进行向下转型;如果返回false,不进行向下转型。
如何使用?
a instanceof A:判断对象a是否是类A的实例。
如果B是A的父类,a instanceof A返回true,则a instanceof B也返回true。
图示:
public class test { public static void main(String[] args) { Person p = new Student(); if (p instanceof Person){ Student s = (Student)p; s.major = "英语"; System.out.println(s.major);//英语 }else{ System.out.println("不匹配的类型"); } } } class Person{ String name; int age; public void eat(){ System.out.println("人吃饭"); } public void sleep(){ System.out.println("人睡觉"); } } class Student extends Person{ String major; public void eat(){ System.out.println("学生吃饭"); } public void study(){ System.out.println("学生努力学习知识"); } }
作者:Java之美
日期:2020-03-29
来源:https://www.cnblogs.com/897463196-a/p/12592494.html