日期:2014-05-20  浏览次数:20751 次

[讨论] 面向对象中的 封装、继承 、多态
关于面向对象的三个基本特征: 封装、继承、多态


上面资料截取自 link

由于文章比较抽象,所以发个帖子跟大家讨论一下....

封装是最容易理解的,有以下几种解释方法:
1. 封装就像你建一个类,然后把这个类的属性和方法定义在一起,同时对这些属性和方法予以“public ,private,protected“等。

2. 该包的包,该漏的漏

3. 就是对数据的隐藏 ,外部用户只需要关心该类的功能和对象,不需要关心具体的实现过程和数据,这是面向对象里面一个很重要的概念

4 . 就像电视,你不需要知道它的内部是由哪些零件组成、如何工作的所以把它们封装起来了,你只知道用遥控器来控制就好
面向对象编程三大思想之一(封装、继承、多态)
(电视机的内部可以理解为class 零件可以理解为 内部function )

内容引用: link 

关于继承和多态:

个人理解 继承 的概念,就像是电视 和 DVD ,各自都有遥控器,但用起来很不方便,于是你把两个遥控器拆掉,自己做了一个万能遥控器,于是这个新遥控器就可以说是继承了电视 ( class TV ) 和DVD ( class DVD ) (组合..)

如上图所示,因为继承的范围包含了很多的概念,本人肤浅的理解如此,希望大家一起讨论剩余的概念分支:

继承,泛化和聚合, 多态,覆盖和重载, 如果概念过泛,请至少讲明白 接口 和 虚函数 以及 虚类 ...

希望一次性的能把这个概念讨论清楚,请拍砖....




------解决方案--------------------
与其在这儿讨论这种见仁见智的抽象问题 还不如买个thinking in java多看一会儿
------解决方案--------------------
楼主的这文章是不是关于C++的啊.

------解决方案--------------------
许多东西不是java里的东西,参考可以。
------解决方案--------------------
继承 的概念,就像是电视 和 DVD ,各自都有遥控器,但用起来很不方便,于是你把两个遥控器拆掉,自己做了一个万能遥控器,于是这个新遥控器就可以说是继承了电视 ( class TV ) 和DVD ( class DVD ) (组合..)
你这样理解就不符合面向对象的设计原则了,应该说电视和DVD都要遥控器,但里面的按键不同,功能也有不同,但是它们都是用来遥控的,所以我抽象出一个抽象父类,抽象的功能就是遥控,而电视的遥控器和DVD的遥控器就是继承了抽象父类的遥控功能,至于怎么遥控由具体的子类来实现,这才是继承的思想,
------解决方案--------------------
继承,没必要想的那么复杂 就是 狗继承动物, 你继承人那么简单
------解决方案--------------------
至于多态,个人理解,在面向对象的设计原则上要求依赖于抽象,而多态就是抽象在面对不同的具体实现有不同的处理方式,比如定义了一个接口Comparable,拥有比较的功能,而自定义的Num类和XString类实现了这个接口,Num类实现的Comparable是比较数字类型的大小,而XString类实现Comparable是为了实现字符串的自然序大小的比较,而我们定义了
Comparable var = new Num();通过var调用比较方法是比较数字大小。
而var = new XString();通过var调用比较方法是比较字符串自然序大小。
对于var来说这就是多态,即通过同一个变量指向不同的实现类而实现了不同的功能。
------解决方案--------------------
面向对象的三大特性,这个在网上随便一搜就有就有好多结果吧。
------解决方案--------------------
额。C++的类关系,要比Java复杂的多。
个人觉得,只要把Java的类关系搞清楚,就足够用了。

C++,由于其类关系复杂,所以,设计的时候非常讲究要用模式,否则,程序员之间无法沟通。
但Java由于相对简单,并且,很多框架都开源,我们只实现其中的关键部分,所以,对模式的要求较弱。

赞同1楼的说,因为Thinking in Java(《Java编程思想》),
是你从面向过程(或者面向结构)编程 向 面向对象编程 的一个转折点。
有空的时候,看看前几章,或者只看每章的重点内容,就可以了。
------解决方案--------------------
你在网上搜索一下你提到的这些关键词,
就自然有答案
或者到wikipedia中去找

我觉的效果过会很好

你的封装的理解基本是正确的

继承和多态就不太对了

继承和多态是对现实中事物的映射

一个很好的例子就是 图形

假设图形中有一个方法使计算图形面的

不同形状有不同的面积计算方法, 所以你在图形shape这个类中定了一个虚的方法叫做 int caculateArea()

然后在三角形triangle,正方形square中 重载这个函数,当然对于不同形状的实现自然是不一样的

这样,如果你知道一个实例是图形,就可以调用caculateArea(),系统会根据这个图形实例到底是什么(正方形还是三角形)自己调用正确的caculateArea();
而不用你自己判断
------解决方案--------------------

这些特性在刚开始学的时候 有一些认识 知道是java的 或是面向对象的特性
感念性的了解 不用指望理解透 

只有在不断的写程序 开发项目 工作期间 才能深入的理解 吃透的
现在就是说的再好 也不一定能理解 
是需要在编写程序时亲身感受的

至少我认为是这样 我在刚学的时候 对这些特性就不是很明白 
但没影响我以后的学习 
慢慢的 代码敲多了 就有了一定的理解 其实都是一种思想

不这么做 完全可以 只是这样 优点多一些

慢慢体会喽 
呵呵


------解决方案--------------------
虚函数是C++中的概念,多态的发生会占用内存空间。所以为了提高效率,在C++中是不会自动发生多态的。如果想发生多态的行为,必须要指定,在函数(Java中称为方法)的前面必须加一个关键字virtual。
------解决方案--------------------
按照C++的理念来说:继承就是派生类复用基类的代码,避免在开发过程中过多的重写不必要的代码,增加开发成本与时间。