1. 对象的多态性
对象多态性前提:
必须有继承或者有接口的实现
必须有方法的重写
多态的语法规则:
父类或者接口的引用指向自己的子类的对象
// 多态的写法 父类(或接口) 变量名(对象名) = new 子类对象();
当对象调用方法时,执行的是子类重写的方法
多态中成员的特点:
多态中成员变的特点:
编译时:若父类中没有该成员变量,编译失败
运行时:如果父类和子类中有同名的成员变量时,会运行父类中的成员变量,而不运行子类中的成员变量
多态中成员方法的特点:
编译时:若父类中没有该成员方法,编译失败
运行时:运行子类重写的方法
总结:成员方法编译看左边,运行看右边;成员变量都是看左边
Person p = new Student();
// 父类:person public class Person { String s = "父类成员"; public void eat(){ System.out.println("人在吃饭"); } } // 子类:Student public class Student extends Person { String s = "子类成员"; public void eat(){ System.out.println("学生吃饭"); } } // main方法 public static void main(String[] args) { Person p = new Student(); //对象p,子类对象,调用成员变量s System.out.println(p.s); //子类对象调用方法 p.eat(); }
多态的转型
多态的程序中,不能调用子类的特有成员
只能调用子类和父类的共有成员
转后类型 变量名 = (转后类型) 要转的数据
public static void main(String[] args) { //创建对象,多态性 //父类 = new 任意子类对象() 扩展 Animal animal = new Cat(); animal.eat(); //Cat类的特有功能 catchMouse()方法 //类型转换,强制 //Cat提升为了Animal,转回Cat类型 Cat c = (Cat)animal; c.catchMouse();
多态性可以提升扩展性,是否需要强制转换,根据实际功能需求来决定
多态中的转型异常
异常ClassCastException 类型转换异常,在多态中经常发生.
是在进行类型的强制转换的时候发生,我们现在的案例是Dog不能转成Cat.
需要解决这个异常 : 对象是Cat转Cat,是Dog换Dog
运算符 : 比较运算符,结果是boolean类型
运算符是关键字 instanceof
instanceof的语法格式:是在进行类型的强制转换的时候发生,我们现在的案例是Dog不能转成Cat.
需要解决这个异常 : 对象是Cat转Cat,是Dog换Dog
运算符 : 比较运算符,结果是boolean类型
运算符是关键字 instanceof
instanceof的语法格式:
对象名 instanceof 类的名字 解析: 比较这个对象,是不是由这个类产生的 c instanceof Cat 解释: c对象是不是Cat类产生的,如果是结果就是true
强制类型转换之前的安全性判断
public static void main(String[] args) { //多态创建对象 Animal animal = new Dog(); animal.eat(); //判断 animal是不是Cat类的对象 //boolean b = animal instanceof Dog ; //System.out.println(b); //调用子类的特有方法 if (animal instanceof Cat){ //if为true,强制转换为Cat Cat c = (Cat)animal; c.catchMouse(); } if (animal instanceof Dog){ Dog d = (Dog)animal; d.lookHome(); } }