多态
同一个对象 体现出来的多种不同形态(身份) 将一种行为表现出不同的效果
体现:
1)父类类型的引用 指向 子类的对象
Person p = new Teacher();
2)该引用只能调用父类定义的属性或方法
对于属性而言
没有重写一说 所以多态调用的就是父类的属性
对于方法而言
如果某一子类将父类的方法重写了 则从new对应的子类依次往上找
直到找到重写的方法 然后执行
4)若想调用子类中独有的成员
(强制类型转换) 造型 铸型 (向上/向下转型)
5)强制向下转型时 可能会出现一个运行时异常
ClassCastException 类型强制转换异常
如果想避免造型时异常 可以用instanceof关键字来进行判断
对象 instanceof 类
public class Animal {String name = "Animal的name属性";public void eat(){System.out.println("动物的吃饭方法");}public void sleep(){System.out.println("动物的睡觉方法");}}
public class Person extends Animal{String name = "Person的name属性";public void eat(){System.out.println("人类吃饭方法");}public void sleep(){System.out.println("人类睡觉方法");}public void talk(){System.out.println("人类说话方法");}}
public class Teacher extends Person{String name = "老师的name属性";public void eat(){System.out.println("老师的吃饭方法");}public void teach(){System.out.println("老师能上课");}}
public class Student extends Person{String name = "Student的name属性";public void talk(){System.out.println("学生说话方法");}public void study(){System.out.println("好好学习 天天向上");}}
public class RunMain {public static void main(String[] args){Object o = new Teacher();//先看定义的是什么类型 就从什么类型开始找有没有方法重写o.hashCode();o.toString();Animal a = (Animal) o;//向下转型a.hashCode();a.toString();System.out.println(a.name);//输出Animal的name属性//先看Teacher有没有重写 再看Person有没有重写 最后看Animala.eat();//因为Teacher重写了 所以输出老师的吃饭方法a.sleep();//因为Teacher没有重写 Person重写了 所以输出人类睡觉方法Person p = (Person) o;p.hashCode();System.out.println(p.name);//输出Person的name属性//先看Teacher有没有重写 再看Person有没有重写 最后看Animalp.sleep();//因为Teacher没有重写 Person重写了 所以输出人类睡觉方法p.eat();//因为Teacher重写了 所以输出老师的吃饭方法p.talk();//因为Teacher没有重写 Person重写了 所以输出人类说话方法Student s = (Student) o;//代码写的时候没有异常 但是运行时会出现异常//ClassCastException 类型强制转换异常s.study();//因为Teacher和Student是同一等级的//转型可以上下转 同级不能转if(o instanceof Student){//通过instanceof来判断是否可以进行类型转换}}}
