面向对象在封装时属性私有化,对外提供set或get方法,既然都提供set/get方法了,为啥属性不Public呢?

       学了这么久的面向对象,突然被问到这样一个问题:“面向对象封装时属性私有化,对外提供set或get方法,既然都提供set/get方法了,为啥属性不Public呢?”。一时间不知道如何解答。。。
      在很多程序中,都喜欢定义一个private变量,然后为这个私有变量加上get(),set()方法。那为什么不直接定义一个public变量呢?这样做到底有什么好处和意义呢?难道真的仅仅只是为了代码规范?别逗了,不管你信不信,反正我是不信!然后带着这个问题在网上寻找答案,真是众说纷纭啊,每个人都能说出一点点道理,但是却都不足以说服我!(所以在这里做一些总结,和大家分享,我们共同学习,共同进步。如果有什么想法和意见,也欢迎大家提出来,我们一起交流。)其中看到有这样一种说法:
      “get()和set()方法起到对外界封闭的作用,举个例子:假如你的裤兜里有很多钱,你肯定不会让别人都来掏,肯定只有自己能拿到,或者你拿出来给他,set和get就相当于你的手,而你类里的变量就相当于你兜里的钱,对于外面的人来说不知道你类里有什么,他就知道调用这个get会给他一个什么东西”
      哇!说的多好,貌似回答得很专业,很形象,很生动,很有道理啊,差一点我就要信了,但是就在千钧一发的时刻,我冷静了下来。TMD的,差点就被你给忽悠了,这个举例完全没有回答实质性的问题嘛,会举例子的人了不起啊~~~~(>_<)~~~~ 。为啥觉得不对呢,你想啊,如果一定要把get()和set()比喻成手的话,也不能比喻成你自己的手,因为get()和set()方法也是public属性的,谁都可以调用,也就是说任何人的手都还是可以拿到你的钱,那和直接把变量设成public有什么区别吗?至于对外面的人来说知不知道你类里有什么,这个只是变量命名规范问题而已,和属性不存在半毛钱关系吧?想让人看见和更改的变量就设成public,不想让人看见和更改的就设成private,已经很天衣无缝了,为什么还要get(),set()方法呢?
      so,我又迷茫了,带着依依不舍的心情,我离开了这位大神,继续寻找答案。其实每个人都知道get()和set()方法肯定是有好处的,但是有什么好处呢却又说不清楚,只能乖乖照做了(但是总有点别扭 哈哈!),而且工具可以帮你自动生成get()和set()方法,一点都不麻烦。但是不能因为不麻烦就傻傻的去做,而不去考虑为什么要这么做,那我们也沦落为了工具呀不是嘛!⊙﹏⊙b汗!又偏题了,继续研究。。。
      其实大多数人讲的是这关系到安全性的问题,貌似有点道理,但是却好象没什么依据,请问我使用public变量有什么不安全? 使用get(),set()安全在哪里?
   有些人说封装性,但是变量本身就是封装在类里面的啊!其实大部分人都是人云亦云,说什么安全性,封装性,只要学java的人都会说,没有一本java的书不提及这些名词, 其实真正理解的人不多。
      我只知道用get()和set()有一个好处,当输入.get(.set) 时就能显示所有的属性。把所有设置都归纳起来,对于外部的使用都方便而已。假如你开发一个类给别人用,人家只要输入.get就能知道所有的属性。(天啊!就只有这么一丢丢的好处?我都不好意思跟别人说!)。难道get()和set()真的只是一种规范做法而已,完全等效于public变量?
      不!我这种人是绝对不甘心找不到答案就把问题归结于代码规范的!

重点来了:

      那我想现在唯一可以让我信服的答案暂时就是:用get()与set()可以控制变量。
      如果get()和set()方法里面只放一个赋值语句的话,和public变量应该没什么区别。但是设想,如果你的变量score代表的是一个学生的数学成绩,理论上,score只可能是0-100的整数,如果你把将score设为public,不用get()和set(),那么用户很可能会输入1-100以外的数字,如果你把将score设为private,再用setScore()来设置分数,你就完全可以控制这种行为了。
      哈哈,没错,明明几句话就可以把这个问题搞定,但是为了把文章写得生动一点,废话多了一点点,请大家见谅!如果有什么好玩的知识点欢迎大家在评论区讨论一起进步哈!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值