zoukankan      html  css  js  c++  java
  • Java多态

    概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。
    原因:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。
    好处:
    1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
    2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。//多态的真正作用,
    可以用在方法的参数中和方法的返回类型中。
    下面有父类Animal和两个子类DogCat说明多态的特性:

    public static void main(String[] args) {
            Animal a=new Dog();
            a.eat();
            a=new Cat();
            a.eat();
    
            /**
             * Output:      dog eat bone
                            cat eat fish
             */
    
            /**
             *  Animal a = new Dog();
                Animal b = new Cat();
                多态就产生了;
                对象有两种类型
                (1) 编译类型
                (2)运行类型
                编译类型:声明变量的类型,Animal,表示把对象看做什么类型
                运行类型 = 对象的真是类型
                编译类型必须是运行类型的父类;
    
                当编译类型和运行类型不同的时候,多态就出现了。
    
                多态 : 对象有多种形态,对象可以存在不同的形式;
    
                多态的前提:可以是继承关系,也可以实现关系(接口和实现类),在开发中多指第二种;
    
                多态的特点:把对象赋给父类变量,在运行时期会表示具体的子类特征
    
             */
    
                //需求:一个饲养员喂养猫和狗,用多态实现
            /*
             * 没有多态时:1.在Person类中定义一个喂养狗的方法feed(Dog d);
             *            2.在Person类中定义一个喂养猫的方法feed(Cat d);
             * 当没有多态时,有多少种动物就需要创建多少种方法,不方便
             * 
             * 有多态时,只需要创建一个feed(Animal a)方法,即可。
             * 当把不同的子类都当做父类类型来看待,
             * 可以屏蔽不同子类对象之间的实现差异,从而写出通用的代码达到通用编程,以适应需求的不断变化
             * 
             */
            //代码实现
            Person p=new Person();
            p.feed(new Dog());
            p.feed(new Cat());
            /*
             * Output : feed...
                        dog eat bone
                        feed...
                        cat eat fish
             */
        }
    
    }
    class Animal{
        public void eat(){
            System.out.println("eat food");
        }
    }
    class Dog extends Animal{
        public void eat(){
            System.out.println("dog eat bone");
        }
    }
    class Cat extends Animal{
        public void eat(){
            System.out.println("cat eat fish");
        }
    }
    class Person{
        //没有多套时要定义好多特定的方法
        public void feed(Dog d){
            System.out.println("feed...");
            d.eat();//Dog eat method
        }
        public void feed(Cat c){
            System.out.println("feed...");
            c.eat();//Cat eat method
        }
        //利用多态,把子类对象当作父类的的一个特殊对象看待,简化编程
        public void feed(Animal a){
            System.out.println("feed...");
            a.eat();//Cat eat method
        }
  • 相关阅读:
    网络安全课 06 【Euler、Fermat定理、Miller-Rabin 概率算法】
    网络安全课 05 【保密通信、秘钥分发】
    网络安全课 04 【双重、三重DES】
    状压DP【蓝桥杯 2019_C++_A T9】
    蓝桥杯 2019 C++ A 题解
    凯撒加密【加密+暴力破解+文本单词匹配】
    蓝桥杯 2018 C++ A 题解 【除7、10】
    rest_framework 分页三种
    rest_framework 序列化篇
    rest_framework 解析器(下 全局配置使用)
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286827.html
Copyright © 2011-2022 走看看