多态顾名思义就是指一个对象可以有多种形态。
父类类型 对象名 = new 子类构造器;
多态中的成员访问特点
方法调用时,编译看左边即父类,运行看右边即子类。
变量调用时,编译看左边,运行也看左边。
也就是,当子类和父类有同样的方法时,多态会调用子类的方法,有相同的变量时会调用父类的变量,且只能用父类的变量,若父类没有该变量,则会报错
多态的优势
在多态的形式下,右边的对象可以实现替换,方便扩展与维护。
public class Test{
People p=new Student();//new Teacher();
//当需要为老师对象时可以直接替换。
}
在定义方法时,使用父类类型作为参数,该方法可以接受该父类的一切子类对象。
问题是:多态下不能使用子类独有的功能。
类型转换问题
多态的形式相当于是把小类型的变量赋予大类型的变量,相反想把大类型的变量赋予小类型的变量时,就需要强制类型转换。
子类 对象变量 = (子类)父类类型的变量
但如果转变后的类型,与真实类型不相符合的话就会报错。
Animal c = new Cat();
Dog d = (Dog)c; // 出现异常 ClassCastException
所以需要一个方法来判断当前对象的真实类型
变量名 instanceof 真实类型
判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true 。