首页 > 代码库 > 面向对象之封装,继承,多态的理解

面向对象之封装,继承,多态的理解

封装

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);
        
        
    }

}

输出结果为:

灯泡开
灯泡关
灯管开
灯管关

 

面向对象之封装,继承,多态的理解