关于java中很多人用get()和set()方法,而不用public的一点总结
在很多程序中,都喜欢定义一个privata变量,然后为这个私有变量加上get(),set()方法。那为什么不直接定义一个public变量呢?这样做到底有什么好处和意义呢?...
在很多程序中,都喜欢定义一个privata变量,然后为这个私有变量加上get(),set()方法。那为什么不直接定义一个public变量呢?这样做到底有什么好处和意义呢?难道真的仅仅只是为了代码规范?别逗了,不管你信不信,反正我是不信!带着这个问题我在网上寻找答案,真是众说纷纭啊,每个人都能说出一点点道理,但是却都不足以说服我!(所以在这里做一些总结,和大家分享,我们共同学习,共同进步。如果有什么想法和意见,也欢迎大家提出来,我们一起交流。)其中看到有这样一种说法:
“get()和set()方法起到对外界封闭的作用,举个例子:假如你的裤兜里有很多钱,你肯定不会让别人都来掏,肯定只有自己能拿到,或者你拿出来给他,set和get就相当与你的手 而你类里的变量就相当与你兜里的钱,对于外面的人来说不知道你类里有什么他就知道调用这个get会给他一个什么东西”
哇!貌似回答得很专业,很形象,很生动,很有道理啊,差一点我就要膜拜了,但是就在千钧一发的时刻,我冷静了下来。TNN的,差点就被你给忽悠了,这个举例完全没有回答实质性的问题嘛,会举例子的人伤不起啊~~~~(>_<)~~~~ 。如果一定要把get()和set()比喻成手的话,也不能比喻成你自己的手,因为get()和set()方法也是public属性的,谁都可以调用,也就是说任何人的手都还是可以拿到你的钱,那和直接把变量设成public有什么区别吗?至于对外面的人来说知不知道你类里有什么,这个只是变量命名规范问题而已,和属性不存在半毛钱关系吧?想让人看见和更改的变量就设成public,不想让人看见和更改的就设成privtata,已经很天衣无缝了,为什么还要get(),set()方法呢?
我又迷茫了,带着依依不舍的心情,我离开了这位大神,继续寻找答案。其实每个人都知道get()和set()方法肯定是有好处的,但是有什么好处呢却又说不清楚,只能乖乖照做了(但是没有糖吃 哈哈!),而且工具可以帮你自动生成get()和set()方法,一点都不麻烦。但是不能因为不麻烦就傻傻的去做,而不去考虑为什么要这么做,那我们也沦落为了工具!⊙﹏⊙b汗!又偏题了,继续研究。。。
其实大多数人讲的是这关系到安全性的问题,貌似有点道理,但是却好象没什么依据,请问我使用public变量有什么不安全? 使用get(),set()安全在哪里?
有些人说封装性,但是变量本身就是封装在类里面的啊!
其实大部分人都是人云亦云,说什么安全性,封装性,只要学java的人都会说,没有一本java的书不提及这些名词, 其实真正理解的人不多。
我只知道用get()和set()有一个好处,当输入.get(.set) 时就能显示所有的属性。把所有设置都归纳起来,对于外部的使用都方便而已。假如你开发一个类给别人用,人家只要输入.get就能知道所有的属性。(天啊!就只有这么一丢丢的好处?我都不好意思跟别人说!)
难道get()和set()真的只是一种规范做法而已,完全等效于public变量?
不!我这种人是绝对不甘心找不到答案就把问题归结于代码规范的!
那我想现在唯一可以让我信服的答案暂时就是:用get()与set()可以控制变量。
如果get()和set()方法里面只放一个赋值语句的话,和public变量应该没什么区别。
但是设想,如果你的变量score代表的是一个学生的数学成绩,理论上,分数只可能是0-100的整数,如果你把将score设为public,不用get()和set(),那么用户很可能会输入1-100以外的数字,如果你把将score设为privata,再用setScore()来设置分数,你就完全可以控制这种行为了。 展开
“get()和set()方法起到对外界封闭的作用,举个例子:假如你的裤兜里有很多钱,你肯定不会让别人都来掏,肯定只有自己能拿到,或者你拿出来给他,set和get就相当与你的手 而你类里的变量就相当与你兜里的钱,对于外面的人来说不知道你类里有什么他就知道调用这个get会给他一个什么东西”
哇!貌似回答得很专业,很形象,很生动,很有道理啊,差一点我就要膜拜了,但是就在千钧一发的时刻,我冷静了下来。TNN的,差点就被你给忽悠了,这个举例完全没有回答实质性的问题嘛,会举例子的人伤不起啊~~~~(>_<)~~~~ 。如果一定要把get()和set()比喻成手的话,也不能比喻成你自己的手,因为get()和set()方法也是public属性的,谁都可以调用,也就是说任何人的手都还是可以拿到你的钱,那和直接把变量设成public有什么区别吗?至于对外面的人来说知不知道你类里有什么,这个只是变量命名规范问题而已,和属性不存在半毛钱关系吧?想让人看见和更改的变量就设成public,不想让人看见和更改的就设成privtata,已经很天衣无缝了,为什么还要get(),set()方法呢?
我又迷茫了,带着依依不舍的心情,我离开了这位大神,继续寻找答案。其实每个人都知道get()和set()方法肯定是有好处的,但是有什么好处呢却又说不清楚,只能乖乖照做了(但是没有糖吃 哈哈!),而且工具可以帮你自动生成get()和set()方法,一点都不麻烦。但是不能因为不麻烦就傻傻的去做,而不去考虑为什么要这么做,那我们也沦落为了工具!⊙﹏⊙b汗!又偏题了,继续研究。。。
其实大多数人讲的是这关系到安全性的问题,貌似有点道理,但是却好象没什么依据,请问我使用public变量有什么不安全? 使用get(),set()安全在哪里?
有些人说封装性,但是变量本身就是封装在类里面的啊!
其实大部分人都是人云亦云,说什么安全性,封装性,只要学java的人都会说,没有一本java的书不提及这些名词, 其实真正理解的人不多。
我只知道用get()和set()有一个好处,当输入.get(.set) 时就能显示所有的属性。把所有设置都归纳起来,对于外部的使用都方便而已。假如你开发一个类给别人用,人家只要输入.get就能知道所有的属性。(天啊!就只有这么一丢丢的好处?我都不好意思跟别人说!)
难道get()和set()真的只是一种规范做法而已,完全等效于public变量?
不!我这种人是绝对不甘心找不到答案就把问题归结于代码规范的!
那我想现在唯一可以让我信服的答案暂时就是:用get()与set()可以控制变量。
如果get()和set()方法里面只放一个赋值语句的话,和public变量应该没什么区别。
但是设想,如果你的变量score代表的是一个学生的数学成绩,理论上,分数只可能是0-100的整数,如果你把将score设为public,不用get()和set(),那么用户很可能会输入1-100以外的数字,如果你把将score设为privata,再用setScore()来设置分数,你就完全可以控制这种行为了。 展开
5个回答
展开全部
我觉得还有一个好处是代码的可读性高。如果你在类中操作其他类的变量都是通过对象名.属性,我觉得我看起来想死,可能是因为代码写多了吧= =
另外那个拿钱的例子,我觉得不是说所有人的手都可以去拿,而是所有人都可以让这个人通过他自己的手拿钱给你,另外你说的最后一句话,是说明这样类好扩展,
比如你原先是分数限制在0-100 在好多类中都调用了。你要是直接通过属性去获取,那就需要在那些类中额外加个判断。但是要是使用set()方法 你就只用写一句,而且万一你条件变了,你也只需要改掉这个类的set()方法,其他类根本就完全剥离了,所以也算一个好处
另外还看到一个 如果你这个变量只允许get 不允许set 那这样意义不就出来了。
另外那个拿钱的例子,我觉得不是说所有人的手都可以去拿,而是所有人都可以让这个人通过他自己的手拿钱给你,另外你说的最后一句话,是说明这样类好扩展,
比如你原先是分数限制在0-100 在好多类中都调用了。你要是直接通过属性去获取,那就需要在那些类中额外加个判断。但是要是使用set()方法 你就只用写一句,而且万一你条件变了,你也只需要改掉这个类的set()方法,其他类根本就完全剥离了,所以也算一个好处
另外还看到一个 如果你这个变量只允许get 不允许set 那这样意义不就出来了。
展开全部
“我只知道用get()和set()有一个好处,当输入.get(.set) 时就能显示所有的属性。”
难道把所有属性设置成public不能在输入.的时候显示所有属性吗?
还有最后一个原因太牵强啊,setScore(-100)不是一样可以吗?跟score= -100有啥区别?
我表示不赞同你。
难道把所有属性设置成public不能在输入.的时候显示所有属性吗?
还有最后一个原因太牵强啊,setScore(-100)不是一样可以吗?跟score= -100有啥区别?
我表示不赞同你。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我觉得 使用get和set 的原因是:如果你将变量设置成public,那你没得选,你的变量一定可以被读取和修改,但是用封装的方式,你可以通过控制是否提供get 和 set 方法来控制你的变量是否可以被读写,比如说我不提供set方法,那说明这个变量只读,自然就安全了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
兄弟看你是犯强迫症了吧.
被我说中了吧.
都是一样的人,也没有必要太丢丢 .
其实你想啊.有一个学生类是这样的.
public class Student{
public int score;
}
哎,人家一看这个类也太开放了,我欺负欺负你.然后创建一个学生,叫小明
Student xiaoMing =new Student();
开始欺负他了:
xiaoMing.score=-60;
太过分了,作为一个学生,不及格就是一种极大的耻辱了,竟然还给我了负分数,小明一向调皮,但这也欺人太甚.
于是小明努力学习编程.修改了这个学生类.
public class Student{
private int score;
public void setScore(int score){
this.score=score;//给我多少算多少
if(score<0){//但是给我个负数欺负我,我就
score=60;//给我来个60分
}
public int getScore(){
return this.scroe;
}
}
当有人来调用这个类的时候,只能是这样了:
Student xiaoMing=new Student();
xiaoMing.setScore(-60);//给我个负数试试
int score= xiaoMing.getScore();
System.out.println(score);
//结果应该是:
60 //给的再少我也能及格..
哈哈..
纯手打的.好累呀.别较真了,兄弟..
被我说中了吧.
都是一样的人,也没有必要太丢丢 .
其实你想啊.有一个学生类是这样的.
public class Student{
public int score;
}
哎,人家一看这个类也太开放了,我欺负欺负你.然后创建一个学生,叫小明
Student xiaoMing =new Student();
开始欺负他了:
xiaoMing.score=-60;
太过分了,作为一个学生,不及格就是一种极大的耻辱了,竟然还给我了负分数,小明一向调皮,但这也欺人太甚.
于是小明努力学习编程.修改了这个学生类.
public class Student{
private int score;
public void setScore(int score){
this.score=score;//给我多少算多少
if(score<0){//但是给我个负数欺负我,我就
score=60;//给我来个60分
}
public int getScore(){
return this.scroe;
}
}
当有人来调用这个类的时候,只能是这样了:
Student xiaoMing=new Student();
xiaoMing.setScore(-60);//给我个负数试试
int score= xiaoMing.getScore();
System.out.println(score);
//结果应该是:
60 //给的再少我也能及格..
哈哈..
纯手打的.好累呀.别较真了,兄弟..
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
想给你个赞但是没办法点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |