Java第十天,多态

多态

一、多态的定义:

一个对象拥有多种形态,这就是对象的多态性。也就是说多态针对的是对象。多态的前提是接口和继承(C++中实行多继承,不存在接口)。

二、多态在代码中的形式:

父类 对象名 = new 子类();

或者

接口 对象名 =  new 实现类();

三、成员方法使用规则:

右边new的是谁,便使用谁的成员方法(编译看左,运行看右)。

四、成员变量使用规则:

①直接通过对象名访问成员变量:

看等号左边是谁,则优先用谁。没有则向上找。

②间接通过成员方法访问成员变量:

看该方法属于谁,则优先用谁,没有则向上找。

五、对象的转型:

①向上转型

(1)其实就是多态的写法,左父右子。向上转型一定是安全的。

(2)对象无法调用子类特有方法。

②向下转型

(1)其实就是还原过程(只能还原为原来类别)。格式为:

子类 对象名 = (子类)父类对象

(2)转型很可能会失败(本来是猫,向上转为动物后,又向下转型为狗)。

(3)如何判断对象本来属于哪个类(子类)。

对象 instanceof 类 ==》 返回一个布尔值。

六、多态的注意事项:

  1. 只有成员方法才能覆盖重写,成员变量不可以覆盖重写。
  2. 父类如果要调用子类的方法必须要有同名方法。
  3. 多态情况下,子父类存在着同名的成员变量时,默认会访问父类的成员变量。
  4. 多态情况下,子父类存在着同名的非静态函数时,默认是访问子类的成员函数。
  5. 多态情况下,子父类存在着同名的静态函数时,默认是访问父类的成员函数。
  6. 多态情况下,不能访问子类特有的成员。

七、代码

Animal类:

package com.lanyue.day08;

public abstract class Animal {

    public static String INFO = "动物界";

    public abstract void eat();
    public abstract void work();
}


Dog类:

package com.lanyue.day08;

public class Dog extends Animal{

    @Override
    public void eat() {

        System.out.println("狗吃骨头");
    }

    @Override
    public void work() {

        System.out.println("狗能看家");
    }
}


Cat类:

package com.lanyue.day08;

public class Cat extends Animal{

    @Override
    public void eat() {

        System.out.println("猫吃鱼");
    }

    @Override
    public void work() {

        System.out.println("猫能抓老鼠");
    }

    public void catPlay(){

        System.out.println("猫喜欢玩");
    }
}


运行类:

package com.lanyue.day08;

public class Demo {

    public static void main(String[] args) {

        Dog dog = new Dog();
        dog.eat();
        dog.work();

        Cat cat = new Cat();
        cat.eat();
        cat.work();

        Animal animal = new Cat();
        animal.eat();
        animal.work();

        if(animal instanceof Cat){

            ((Cat) animal).catPlay();
            System.out.println("猫属于" + Animal.INFO);
        }
    }
}


原文地址:https://www.cnblogs.com/viplanyue/p/12700540.html