zoukankan      html  css  js  c++  java
  • JAVA基础复习一 面向对象三大特征之一:为什么要有多态性

    面向对象有三大特征:

    1. 封装 2. 继承 3. 多态

    前两种特性都好理解,大部分人都知道他的好处;但是对于多态性,很多人不太清楚。为什么要有多态性,多态性的好处是什么?下面通过一个例子来说明多态性的好处。

    package com.winson.oop;
    
    public class AnimalTest {
        public static void main(String[] args) {
            AnimalTest test = new AnimalTest();
            test.func(new Dog());
            System.out.println("--------------------------------------");
            test.func(new Cat());
        }
    
        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("猫:喵!喵!喵!");
        }
    }
    
    

    运行结果:

    狗:吃肉
    狗:汪!汪!汪!
    --------------------------------------
    猫:吃鱼
    猫:喵!喵!喵!
    

    通过分析运行结果可知,这里正是利用的多态性,实现了调用func(Animal animal)方法时,实例化的是Dog或者Cat对象,调用了Animal的子类Dog或者Cat中重写的方法,这样,即使你再有什么牛、马、羊需要调用eat()或者shout()方法,也可以重用func()方法,而不用为每一个子类,新建一个func()方法;

    多态:父类引用子类的方法。如何理解这句话?

    之前学习JAVA的时候,一直没明白这句话的意思,通过内存分析,我们就可以理解了;

    Animal animal = new Dog();
    

    animal变量存在栈中,对象新建在堆中,栈中就是父类,堆中存的就是子类的对象,因为父类是引用类型,所以父类引用子类的方法;

  • 相关阅读:
    SpringBoot 调用 K8s metrics-server
    Kubernetes 实战——有状态应用(StatefulSet)
    Kubernetes 实战——升级应用(Deployment)
    Kubernetes 实战——发现应用(Service)
    Kubernetes 实战——配置应用(ConfigMap、Secret)
    Java 集合使用不当,Code Review 被 diss了!
    30 个 ElasticSearch 调优知识点,都给你整理好了!
    关于线程池的面试题
    Java面试必问,ThreadLocal终极篇
    Java代码中,如何监控Mysql的binlog?
  • 原文地址:https://www.cnblogs.com/elnimo/p/13226277.html
Copyright © 2011-2022 走看看