面向对象特征之多态性

面向对象的多态性:

1.多态性理解为一个事物多种表现形态

  ①. 方法的重载与重写为多态性的表现

  ②.子类对象的多态性

2.子类对象的多态性使用的前提:①要有类的继承

                                                      ②子类要有对父类方法的重写

3.程序运行分为编译状态和运行状态。

                  对于多态性来说,编译时,看左边,将此引用变量理解为父类的类型

                  运行时,看右边,关注对象的实体:子类的对象,那么执行的方法就是子类重写的。

4.子类对象的多态性,并不适用于属性

 

// instanceof:
// 格式:对象a instanceof 类A :判断a是否是类A的一个实例,是的话,返回true,否则返回false
// 若a是A的实例, 那么a也一定是A类的父亲的实例

 

Person:

package com.aff.java1;

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

    public Person() {
        super();
    }

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

    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 void walk() {
        System.out.println("走路");
    }

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

}

 

Man:

package com.aff.java1;

public class Man extends Person {
    private boolean smoking;

    public Man() {
        super();
    }

    public Man(String name, int age) {
        super(name, age);
    }

    public boolean isSmoking() {
        return smoking;
    }

    public void setSmoking(boolean smoking) {
        this.smoking = smoking;
    }

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

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

    public void entertainment() {
        System.out.println("请客");
    }

}

 

Woman:

package com.aff.java1;

public class Woman extends Person {
    private boolean beauty;

    public Woman(boolean beauty) {
        super();
        this.beauty = beauty;
    }

    public Woman() {
        super();
    }

    public boolean isBeauty() {
        return beauty;
    }

    public void setBeauty(boolean beauty) {
        this.beauty = beauty;
    }

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

    public void eat() {
        System.out.println("吃水果");
    }

    public void shooping() {
        System.out.println("购物");

    }
}

 

TestPerson:

package com.aff.java1;

public class TestPerson {
    public static void main(String[] args) {
        Person p = new Person();
        p.eat();
        p.walk();

        Man m = new Man();
        m.eat();
        m.walk();

        // 子类对象的多态性:父类的引用指向子类对象
        // 也可以说子类对象的实体赋给父类对象的引用
        Person p1 = new Man();// 向上转型
        // 虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父类的方法
        p1.eat();
        p1.walk();// 吃菜 直走 输出的为 new man

        // p1.entertainment(); 调不出来的 应为没有继承 person没有这个方法

        Person p2 = new Woman();
        p2.eat();
        p2.walk();
        // p2.shooping(); 同理调用不了,但是可以使用向下转型

        // 这样理解 父类的为上 , 子类为下
        Woman w = (Woman) p2;// 向下转型, 父类person转换为woman了
        w.shooping();

        // instanceof:
        // 格式:对象a instanceof 类A :判断a是否是类A的一个实例,是的话,返回true,否则返回false
        // 若a是A的实例, 那么a也一定是A类的父亲的实例
        if (p1 instanceof Woman) {
            System.out.println("能进来");
            Woman w1 = (Woman) p1;
            w1.shooping();
        }
        if (p1 instanceof Man) {
            Man m1 = (Man) p1;
            m1.entertainment();
        }
        if (p1 instanceof Person) {
            System.out.println("进来了");
        }
    }
}

 

posted @ 2020-03-18 15:19  林淼零  阅读(606)  评论(0编辑  收藏  举报