首页 > 代码库 > 面向对象之封装,继承,多态的理解
面向对象之封装,继承,多态的理解
封装
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); } }
输出结果为:
灯泡开
灯泡关
灯管开
灯管关
面向对象之封装,继承,多态的理解