java中的封装问题

来源:百度知道 编辑:UC知道 时间:2024/05/17 07:42:50
在封装中,为什么要把数据设为private,然后通过get和set对数据进行操作?直接操作不行吗??人家说这样安全,为什么安全?在书上看的是这样使没有任何办法可以对他进行修改,去报不受外界的干扰。他怎么不收外界的干扰啊,直接对数据进行操作和用set操作有什么区别吗?
哪位大虾能通俗点告诉我啊,明白了再加30分~~~
谢谢
对于那种比如是private salary;只能用addsalary()方法对salary进行操作而不能直接操作的数据变量我还能理解,这样防止了别的类对salary随便操作,但是对于那些get和set的数据域就不懂了,感觉完全没必要

答案:设置这个读取方法的直接目的是为了不让其他类直接操作
set和get可以操作这个数据,但是必须通过本类来操作,但是java中,不在同一个包,又不是public的类,其他包中的类是不能访问的,类似的,就是说我只有本工程的类才能访问我这个private的类,调用这个private的方法,这样你就只有通过其他封装的接口提供给其他包中的类了,这样封装的好处,一个是安全,一个是只提供接口,不提供实现方式,方便修改你的方法

首先private属性的作用域你知道是什么么?
如果你清楚了这一点,疑问就迎刃而解了
private的作用域是本类及其子类,也就是说,只有这个类本身,以及他的子类才能使用。那如果其他类想使用private的对象怎么办,那就只有给他们提供一个读写方法,就是get和set的方法,来进行操作。但是这个操作的具体实现是本类来实现的,这就杜绝了其他类进行非法操作
这就好像你去银行使用atm机,你只能告诉他你需要取多少钱,或者存多少钱,由银行来给你操作,但是你自己不能直接去操作银行的数据库,这样对银行来说他只给你atm这个接口,具体实现自己做就很安全,不会怕你乱改他们的数据库。
这么说你明白了么?

关于这个问题,我想举一个例子:

lz如果你接触过老的面向过程的编程,
以前封装性很差的程序是这样的
比如用C写一套处理链表的程序,他的数据和函数是分开的
数据保存在一个内存区域里,所有相关的函数,比如增加节点啊,减少节点什么的都是直接操作这个内存区域的指针
比如这样
LIST *p=.....;//开辟空间
AddNode(p,...)//这样来操作
带来了很多额外的不安全因素,因为谁都可以操作这个指针
如果你写的是一个第三方库,那么别人使用的时候完全不在你的控制之下

现在的面向对象程序则不然,
将数据和与之对应的操作(也就是方法)绑定在一个块中
比如在Java中
LinkedList list=new LinkedList();
list.add(...);
这样所有的内部结构对于外部用户都是透明的,不用管内部实现和结构,如何储存数据,都不用管内部实现(一些数据程序成员的访问权限是private protected就是为了数据安全性)
而原先的方式,数据是非封装的,因为外部程序可以随便更改数据,不利于程序的安全运行

以上提到的就属于面向对象封装性的意义,不过实际的好处还不只这些
lz有问题,欢迎给我发消息,我们可以具体讨论一下