面向对象特征三:多态性

对象的多态性

多态性,是面向对象中最重要的概念,在Java中的体现:对象的多态性:父类的引用指向子类的对象

格式:(父类类型:指子类继承的父类类型,或者实现的接口类型)

父类类型 变量名 = 子类对象;

举例

Person p = new Student();
Object o = new Person();//Object类型的变量o,指向Person类型的对象
o = new Student(); //Object类型的变量o,指向Student类型的对象

对象的多态:在Java中,子类的对象可以替代父类的对象使用。所以,一个引用类型变量可能指向(引用)多种不同类型的对象

多态的理解

Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边;运行时,看右边。

  • 若编译时类型和运行时类型不一致,就出现了对象的多态性(P从
  • 多态情况下,“看左边”:看的是父类的引用(父类中不具备子类特有的方法)  “看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)

多态的使用前提:① 类的继承关系 ② 方法的重写

多态示例

public class Person {
    private String name;
    private int age;

    int id = 0;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }

    public void eat(){
        System.out.println("人吃饭");
    }

    public void  walk(){
        System.out.println("人走路");
    }
}

创建子类继承Person

public class Man extends Person {
    boolean isSmoking;
    int id = 1;
    public void eat(){
        System.out.println("男孩子爱吃肉");
    }

    public void  walk(){
        System.out.println("男人走路快");
    }

    public static void main(String[] args) {
        System.out.println("1");
    }

    public void earnMoney(){
        System.out.println("男人挣钱养家");
    }
}
public class Women extends Person {
    boolean isBeauty;
    public void eat(){
        System.out.println("女人少吃减肥");
    }

    public void  walk(){
        System.out.println("走路好看");
    }

    public void shopping(){
        System.out.println("女孩喜欢逛街");
    }
}

测试类

    public static void main(String[] args) {
        //之前构造对象
        Person person = new Person();
        Man man = new Man();
        //多态
        Person p1 = new Man();

        /**
         * 虚拟调用:多态调用:编译时认为调用父类方法,实际执行的是子类中重写的方法
         * 编译看左边,执行看右边
         */
        p1.eat();
        p1.walk();
        //多态适用于 方法,不适用于属性
        System.out.println(p1.id);//直接打印了 父类中的ID

    }

多态特点

好处:变量引用的子类对象不同,执行的方法就不同,实现动态绑定。代码编写更灵活、功能更强大,可维护性和扩展性更好了。

弊端:一个引用类型变量如果声明为父类的类型,但实际引用的是子类对象,那么该变量就不能再访问子类中添加的属性和方法。

posted @ 2023-05-13 09:18  晓枫的春天  阅读(76)  评论(0编辑  收藏  举报