多态
    同一个对象 体现出来的多种不同形态(身份) 将一种行为表现出不同的效果

    体现:
    1)父类类型的引用 指向 子类的对象
    Person p = new Teacher();
    2)该引用只能调用父类定义的属性或方法
    对于属性而言
    没有重写一说 所以多态调用的就是父类的属性
    对于方法而言
    如果某一子类将父类的方法重写了 则从new对应的子类依次往上找
    直到找到重写的方法 然后执行
    4)若想调用子类中独有的成员
    (强制类型转换) 造型 铸型 (向上/向下转型)
    5)强制向下转型时 可能会出现一个运行时异常
    ClassCastException 类型强制转换异常
    如果想避免造型时异常 可以用instanceof关键字来进行判断
    对象 instanceof 类

    1. public class Animal {
    2. String name = "Animal的name属性";
    3. public void eat(){
    4. System.out.println("动物的吃饭方法");
    5. }
    6. public void sleep(){
    7. System.out.println("动物的睡觉方法");
    8. }
    9. }
    1. public class Person extends Animal{
    2. String name = "Person的name属性";
    3. public void eat(){
    4. System.out.println("人类吃饭方法");
    5. }
    6. public void sleep(){
    7. System.out.println("人类睡觉方法");
    8. }
    9. public void talk(){
    10. System.out.println("人类说话方法");
    11. }
    12. }
    1. public class Teacher extends Person{
    2. String name = "老师的name属性";
    3. public void eat(){
    4. System.out.println("老师的吃饭方法");
    5. }
    6. public void teach(){
    7. System.out.println("老师能上课");
    8. }
    9. }
    1. public class Student extends Person{
    2. String name = "Student的name属性";
    3. public void talk(){
    4. System.out.println("学生说话方法");
    5. }
    6. public void study(){
    7. System.out.println("好好学习 天天向上");
    8. }
    9. }
    1. public class RunMain {
    2. public static void main(String[] args){
    3. Object o = new Teacher();//先看定义的是什么类型 就从什么类型开始找有没有方法重写
    4. o.hashCode();
    5. o.toString();
    6. Animal a = (Animal) o;//向下转型
    7. a.hashCode();
    8. a.toString();
    9. System.out.println(a.name);//输出Animal的name属性
    10. //先看Teacher有没有重写 再看Person有没有重写 最后看Animal
    11. a.eat();//因为Teacher重写了 所以输出老师的吃饭方法
    12. a.sleep();//因为Teacher没有重写 Person重写了 所以输出人类睡觉方法
    13. Person p = (Person) o;
    14. p.hashCode();
    15. System.out.println(p.name);//输出Person的name属性
    16. //先看Teacher有没有重写 再看Person有没有重写 最后看Animal
    17. p.sleep();//因为Teacher没有重写 Person重写了 所以输出人类睡觉方法
    18. p.eat();//因为Teacher重写了 所以输出老师的吃饭方法
    19. p.talk();//因为Teacher没有重写 Person重写了 所以输出人类说话方法
    20. Student s = (Student) o;//代码写的时候没有异常 但是运行时会出现异常
    21. //ClassCastException 类型强制转换异常
    22. s.study();//因为Teacher和Student是同一等级的
    23. //转型可以上下转 同级不能转
    24. if(o instanceof Student){//通过instanceof来判断是否可以进行类型转换
    25. }
    26. }
    27. }