关于面向对象中的get 和set方法的总结,为什么不用public的详解,详解。

我们都知道去构造一个实体类的时候 标准都是去 private 一个私有变量,然后再给这个私有 变量加上 公开 get () 和 set ()。 我总是会忍不住去想一下,为什么不直接去public 变量,是为了什么?是一种标准,还是说有什么好处。发现网上确实有很多解释,但都不全面,不准确,不仔细,不深入,我找了一个特别有意思的 解释就是:

   “get()和set()方法起到对外界封闭的作用,举个例子:假如你的裤兜里有很多钱,你肯定不会让别人都来掏,肯定只有自己能拿到,或者你拿出来给他,set和get就相当与你的手  而你类里的变量就相当与你兜里的钱,对于外面的人来说不知道你类里有什么他就知道调用这个get会给他一个什么东西” —————— 别人的解释

看上去确实很有道理,讲的好像也是十分通透,其实不然,第一,public 的get set方法是其他类调用来 ,是公共的方法,谁都可以调用,用自己的手来表达不太合适,其他人都能来调用,这不就说明其他人的手也能来拿你的钱吗?而且我们思考的是 为什么不直接去public 变量 为什么要弄得这么复杂,对与外面的人来说知不知道你类里有什么,这个只是变量命名规范问题而已,想让人看见和更改的变量就设成public,不想让人看见和更改的就设成privtata,为什么还要get(),set()方法呢?

后面我又找到了一个人的解释:

使用get()和set()而不使用public的成员变量,是因为我们设计类的时候要遵循这样的原则:

---------------------------------------------------------------------------------------------------------------------------------
1.提供类的人要尽量将类中有什么隐藏起来,只告诉使用者你能做什么
2.使用类的人不关心你的类中有什么,只关心类提供了什么功能
3.所以设计类的时候要尽量不提供public的成员变量,最好一个都没有,只提供接口
4.这条原则其实不仅是代码规范的问题,放到工作中,这就是多项目组或多部门之间合作的准则
5.这条原则也绝对不是某个独自编码的程序狼一拍脑袋就想出来,这是经历过有组织开发过工作的程序猿才能设计出来的。

---------------------------------------------------------------------------------------------------------------------------------
 

广泛的说的很有道理,不过没有解释详细为什么,现在我来分析一下我的看法,从代码来解释清晰,如有错误,遗漏欢迎大家里补缺。

 

 上面是一个很简单是实体类。

首先我们从封装性来理解为什么不能去public 数据字段。

    public 数据字段后,就代表着程序中的任何方法都能去读取和修改,这一定不就完全的破坏了封装性吗?记得实现封装的关键在于什么吗?绝对不能让类中的方法直接访问其他类的实例字段,这不就破坏了封装性吗?有些代码就可以利用这种存取权限,搞些我们不希望看到的事情。

第二,我们要从使用get set方法后与直接public变量的区别在哪里。

  看上图,很容易发现name是一个只读字段,一旦设置之后就没有任何方法可以对它进行更改,这样我们可以确保name是不会被外界给破坏的,public的话那是可以被更改的,你也不希望你的名字被人肆意更改吧。number不是一个只读字段,但是只能被嫦changeNumber所修改。特别是这个值出现了错误,我们只需要去调试一下这个方法就好了,假若是number这个字段是公共的,那么你是很难调试的,不知道错误发生在哪里,破坏了这个字段哪里都有可能。

所有有了一个标准,获取或者设置实例字段的值,只需要提供三个内容
1.一个私有的数据字段。
2.一个公共的字段访问器方法
3.一个公告的字段更改器方法

这绝对不是仅仅为了规范代码!

这里面还有一个好处就是 我们实现了其封装性,这就意味着我们可以去修改存储数据的方式,只需要使用相同的方法去操作数据,这个变化对程序的影响基本没有你觉得public能做到这一点吗?其实还有俩点不是很隐形,不咋重要的好处,这里就留给你们自己思考了。

强烈要求关注我!!!

(求你们了55);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值