zoukankan      html  css  js  c++  java
  • 面向对象之封装,继承,多态的理解

    封装

    1.什么是封装

      封装(encapsulation)又叫隐藏实现(Hiding the implementation)。就是只公开代码单元的对外接口,而隐藏其具体实现。

      其实生活中处处都是封装,手机,电脑,电视这些都是封装。你只需要知道如何去操作他们,并不需要知道他们里面是怎么构造的,怎么实现这个功能的。

    2.如何实现封装

      在程序设计里,封装往往是通过访问控制实现的。C++,Java,AS3中都有 Public, Protected, Private 等访问控制符。通过用Public将信息暴露,Private,Protected将信息隐藏,来实现封装。

    3.封装的意义

      a.封装使得对代码的修改更加安全和容易。将代码分成了一个个相对独立的单元。

      只要你电脑的接口不变,比如USB接口电源接口等,无论以后电脑怎么更新,再怎么强大,只要这些接口不变,你依然会使用电脑。

      封装所带来的好处是:明确的指出了那些属性和方法是外部可以访问的。这样当你需要调整这个类的代码时,只要保证公有(Public:)属性不变,公有方法的参数和返回值类型不变,那么你就可以尽情的修改这个类,而不会影响到程序的其他部分,或者是使用到这个类的其他程序。这就是为什么对代码访问控制得越严格,日后你对代码修改的自由就越大。

      b.封装使整个软件开发复杂度大大降低。

      能很好的使用别人的类(class),而不必关心其内部逻辑是如何实现的。你能很容易学会使用别人写好的代码,这就让软件协同开发的难度大大降低。

      c.封装还避免了命名冲突的问题。

      封装有隔离作用。电话上的按键和电视遥控器上的按键肯定用处不同。但它们都可以叫做按键,为什么你没有弄混呢?很显然一个属于电话类一个属于遥控器类。不同的类中可以有相同名称的方法和属性,但不会混淆。

    继承

      核心思想不仅仅是重用现有的代码,用一些已有的类去创建新的类。

      继承的主要思想就是将子类的对象作为父类的对象来使用

      具体实例化一个例子来说,就是鸟作为父类,喜鹊作为子类,鸟包括喜鹊,喜鹊是鸟的一种。

    复合

      提到了继承就必须提一下复合,复合是只将一些已有的类进行组合,组成新的类。

      程序设计中,复合体现在生成的新类里用到了现有类的实例。

      具体一个例子来说,汽车是由轮胎、发动机、玻璃这些内容组成的,这里我们先定义了轮胎、发动机、玻璃这些类,但是没有定义汽车类。那么现在我们定义汽车类的时候就只需要把轮胎、发动机、玻璃这些类拿过来进行组合就可以了。

    何时用继承,何时用复合?

      在实际编程中,使用复合的频率要远远超过继承,对于新手而言,要慎用继承,勤用复合。

      a.需要用到向上转换时请考虑继承。

      b.当两个类进行组合时,如果可以拟定为次级的类拥有另一个类的属性的时候,即父子级关系的时候,用继承,否则拟定的次级的类不能完全当做另一类的属性来使用的话,就采用复合。举例来说就是鸟和麻雀;汽车和轮胎。

    多态

      多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

    多态的条件:

      一、要有继承;
      二、要有重写;
      三、父类引用指向子类对象。

    多态的好处:

    多态对已存在代码具有可替换性。

    多态对代码具有可扩充性。

    它在应用中体现了灵活多样的操作,提高了使用效率。

    多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

    Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载

    例:

    package com.deng;
    
    public class Deng {
        public void QiDong(){
            System.out.println("灯开");
        }
        public void GuanBi(){
            System.out.println("灯关");
        }
    }
    package com.deng;
    
    public class DengGuan extends Deng {
        public void QiDong(){
            System.out.println("灯管开");
        }
        public void GuanBi(){
            System.out.println("灯管关");
        }
    }
    package com.deng;
    
    public class DengPao extends Deng {
        public void QiDong(){
            System.out.println("灯泡开");
        }
        public void GuanBi(){
            System.out.println("灯泡关");
        }
    }
    package com.deng;
    
    public class House {
        public void Kai(Deng d){
            d.QiDong();
        }
        public void Guan(Deng d){
            d.GuanBi();
        }
    }
    package com.deng;
    
    public class Test {
    
        public static void main(String[] args) {
            House h =new House();
            DengPao dp = new DengPao();
            DengGuan dg= new DengGuan();
            
            h.Kai(dp);
            h.Guan(dp);
            
            h.Kai(dg);
            h.Guan(dg);
            
            
        }
    
    }

    输出结果为:

    灯泡开
    灯泡关
    灯管开
    灯管关
  • 相关阅读:
    力扣452题、435题、56题(用最少量的箭引爆气球,无重叠区间,合并区间)
    力扣860题(柠檬水找零)
    力扣135题、406题(分发糖果、根据身高重建队列)
    力扣134题(加油站)
    力扣1005题(K次取反后最大化的数组和)
    力扣122题、714题(买卖股票)
    力扣53题(最大子序和)
    力扣376题(摆动序列)
    力扣455题(分发饼干)
    力扣51题(n皇后)
  • 原文地址:https://www.cnblogs.com/claricre/p/6232250.html
Copyright © 2011-2022 走看看