多态

1.理解多态性

可以理解为一个事物的多种形态

2.何为多态性

多态性指的是对象的多态性,即父类引用指向子类的对象

3.多态的使用:虚拟方法的调用

有了对象的多态性以后,我们在编译期只能调用父类中声明的方法,但在运行期我们实际执行的是子类重写父类的方法。
总结:编译看左边,运行看右边

4.多态的使用前提

存在:

  1. 类的继承关系
  2. 方法的重写
5.多态性的使用举例
package polymorphism.test;

/**
 * @BelongsProject: untitled
 * @BelongsPackage: polymorphism.test1
 * @Author: mcc
 * @CreateTime: 2020-08-16 09:29
 * @Description:
 */
public class AnimalTest {
    public static void main(String[] args) {
        AnimalTest animalTest = new AnimalTest();
        animalTest.func(new Dog());
    }

    /**
     * Animal animal = new Dog();此处声明一个Animal,但是实际上是new Dog(),这就是
     * 多态中子类对象的形式;在方法体里面调用功能时,由于声明的是Animal类型的,所以只能够
     * 调用Animal的方法,但是实际上new Dog(),所以运行上执行的是Dog重写Animal的方法
     * @param animal
     */
    public void func(Animal animal) {
        animal.eat();
        animal.shout();
    }
}

class Animal {
    public void eat() {
        System.out.println("动物:进食");
    }

    public void shout() {
        System.out.println("动物:叫");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗:吃骨头");
    }

    @Override
    public void shout() {
        System.out.println("汪!汪!汪!");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫:吃鱼");
    }

    @Override
    public void shout() {
        System.out.println("喵!喵!喵!");
    }
}

如果不使用多态性:

package polymorphism.test;

/**
 * @BelongsProject: untitled
 * @BelongsPackage: polymorphism.test1
 * @Author: mcc
 * @CreateTime: 2020-08-16 09:29
 * @Description:
 */
public class AnimalTest {
    public static void main(String[] args) {
        AnimalTest animalTest = new AnimalTest();
        animalTest.func(new Dog());
    }
    /*
     * 没有多态性就意味着要造许多重载的func方法,现在只有两个继承类,当又要
     * 增加继承类时,func要重载的次数会更多,代码的冗余就体现了出来*/

    public void func(Dog dog) {
        dog.eat();
        dog.shout();
    }

    public void func(Cat cat) {
        cat.eat();
        cat.shout();
    }
}

class Animal {
    public void eat() {
        System.out.println("动物:进食");
    }

    public void shout() {
        System.out.println("动物:叫");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗:吃骨头");
    }

    @Override
    public void shout() {
        System.out.println("汪!汪!汪!");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫:吃鱼");
    }

    @Override
    public void shout() {
        System.out.println("喵!喵!喵!");
    }
}
6.对象的多态性,只适用于方法,不适用于属性
package shuxing.test;

/**
 * @BelongsProject: untitled
 * @BelongsPackage: shuxing.test
 * @Author: mcc
 * @CreateTime: 2020-08-16 12:53
 * @Description:
 */
public class PersonTest {
    public static void main(String[] args) {
        Person person = new Student();
        System.out.println(person.id);
    }
}

class Person {
    int id = 10;

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

class Student extends Person {
    int id = 20;

    @Override
    public void eat() {
        System.out.println("学生:吃有营养的食物");
    }
}

在这里插入图片描述
通过现有的知识很难去推论出来,这儿只能通过结论来明确java是怎么规范的。运行结果是调用了person的id,所以对于属性来说编译与运行均看左边。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值