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

面向对象中的封装性怎么理解?
各位前辈你们好!
我学了一段时间的java了,但是对于其中的封装性还是理解的不是很好,麻烦各位指点一下!
我知道“类”是封装的基本单位,它把属性和方法封装在一起,通过方法可以对类中的属性进行操作!
我有一个疑问,比如我把属性用Private进行修饰,则类的属性只能在本类中进行操作,这个操作仅仅指的是对属性进行赋值吗?外部也可以通过公用的方法对属性进行赋值,那么private不是没有起到作用?我对这一块有点模糊,还希望大家多多发言,谢谢!

------解决方案--------------------
你打电话叫开封菜的外卖 你只需要打一个电话 然后告诉他你要吃什么 地址在哪儿 然后他就给你送上门来了

你调用一个方法 然后方法给你出结果 就相当于这个过程 这就是封装性
你不需要知道具体过程是怎么实现的 你只需要关心结果是否正确就行
------解决方案--------------------
至于你的第一疑问,操作属性并不仅仅是赋值哦,也可以修改属性内容,如果属性是对象,是数组,是集合呢。。。关于private的用法,很明显就是你理解还没到位,private可以修饰变量、构造器,方法、内部类;在变量前面加private 表示类的私有属性,只可以在类内部访问使用;你可以这样写测试代码去理解它,在内部类、同一包下的其他类、不同包下的类中对它进行访问,看看结果。我主要是来赚积分的哦,现在csdn的积分为0,有几个很重要的东东没有办法下载,积分全给我吧 我会感谢你。。。
------解决方案--------------------
封装这个解释,我一直喜欢用CPU作为例子
CPU把所有的电阻电容门电路等都封装起来,只留出一些管脚(接口)让用户使用,CPU能暴露什么,不能暴露什么,是生产商设计决定的,用户不能直接操作CPU的电阻电容等等,但可以通过給管脚适当的电压来控制电阻电容等,也就是说用户不能直接访问CPU的属性,但是可以通过方法修改CPU的属性的值
同样的一个类也是把属性算法(逻辑处理)封装起来,只留必要的方法(接口)让用户使用,一个类该暴露什么,不该暴露什么,由类的设计者根据需求设计决定的。private属性用户不能直接访问,如果设计者提供相应的接口方法,那么用户可以通过该接口方法访问。
LZ的疑惑在于通过方法能修改属性和直接修改属性的区别,直接修改相当于不经过门电路直接给CPU的电阻电容等元件输个电压,这样这个电压(电流)是否超载不能有效保证,元件就有可能被烧坏,所以提供相应的方法访问属性,可以在方法中做相应的控制。同样的,一个类,不直接修改属性而通过方法来修改,可以在方法里做相应的处理避免用户输入的一些非法数据而造成系统故障。只不过对于POJO类来说,因为类本身只是作为数据的载体,并不带有逻辑处理,所以一般的set方法就是简单的给属性赋值。

------解决方案--------------------
封装性不一定局限在类这个层面,你可以往大的方向上理解。
服务提供者把它服务的细节隐藏掉,你只需要提交请求与传递它需要的参数,它就会给你返回结果,而这个结果是如何产生的,经过了多少复杂运算,经过多少次数据读取,你都不用管,只要它给你结果就好了。
这也是一种封装,即服务提供者把实现的细节隐藏起来,不对外公布。