多态

父类

package com.encapsulation.demo03;

public class Person {
    public void  run () {
        System.out.println("run");
    }

}

子类1

package com.encapsulation.demo03;

public class Student1 extends Person {
    // 把父类的方法进行重写
    @Override
    public void run() { // 根据父类调用 重写为son1
        System.out.println("son1");
    }
    public void eat() {
        System.out.println("eat");
    }
}

子类2

package com.encapsulation.demo03;

public class Student2 extends Person {
    // 把父类的方法进行重写
    @Override
    public void run() { // 根据父类调用 重写为son2
        System.out.println("son2");
    }
    public void eat2() {
        System.out.println("eat2");
    }
}

调用

package com.encapsulation.demo03;

public class Application {
    public static void main(String[] args) {
        // 一个对象的实际类型是确定的
        // 可以指向的引用类型是不一定的: 父类的引用指向子类

        // Student能调用的方法都是自己的或者是父类的
        Student s1 = new Student();
        
        
        // Person 父类型,可以指向子类,但是不能调用子类独有的方法  
        // 指向子类Student1 由Student1重写父类的方
        Person s2 = new Student1();
        
        // 指向子类Student2 由Student2重写父类的方法
        Person s3 = new Student2();
        Object s4 = new Student(); // Object为所有类的祖宗类
        

        s1.run(); // son1
        s2.run(); // Student1重写  打印: son1
        s3.run(); // Student2重写  打印: son2
        // 对象能执行哪些方法,主要看对象左边的类型,和右边的关系不大
        ((Student) s2).eat();// 强制转换 高转低 把 Person类型转换为 Student

    }
}

image

总结

  1. 多态是方法的多态,属性没有多态
  2. 父类和子类,有联系 类型转换异常! ClassCastException!
  3. 存在的条件
    1. 继承关系
    2. 方法需要重写
    3. 父类引用指向子类对象 father f1 = new Son();
  4. 概念
    1. 一个父类有很多子类, 不同的子类负责重写父类的方法
    2. 当父类需要用不同的功能时,就指向不同的子类就可以了 【father f? = new Son?(); 】来完成各种功能,让实例表现不同的状态
posted @ 2021-06-29 11:18  橙子yuan  阅读(24)  评论(0)    收藏  举报