java类成员为什么要写成private然后再用get set方法
既然又可以读又可以写,为什么不直接写成public,反而去用getset多此一举的感觉增加代码量还看起来还更繁杂...
既然又可以读又可以写,为什么不直接写成public ,反而去用get set多此一举的感觉增加代码量还 看起来还更繁杂
展开
4个回答
展开全部
1 将数据与行为分离,也就是java的面向对象的概念。
对象就是属性+行为,封装就是把对象的私有属性封装起来,只有通过自己公开的行为去改变(获得)对象内部的私有属性信息,而那些public的方法正是面向其他对象的接口,只有通过接口去改变(获得)对象的私有属性
2 安全性
设想,你有一个Person类代表一个人,Person有一个char类型的sex字段表示性别,理论上,sex只接受两个值, 'M '和 'F ',但如果你把sex字段设为public,你很难限制你的用户只给它赋 'M '或 'F '值。将sex设为private,再用setSex()来设置性别,你就完全可以控制这种行为了。而且你还可以控制只能get不能set,或相反,但如果是public就不行了。别外有一点属性我们可能并不希望其他用户对我们的属性进行写操作,这个时候,可以直接不写setX方法。这就是只读属性了。
3 编码规范性
我们在设计类,或者作com组件时经常告诉其实coder,你只需要调用我的XX接口方法就可以了,内部我是怎么实现的,你不用管,如果面向特定的环境特定的时间段,直接将属性声明为public,让外部对象访问也未偿不可,没有面象对象思想时,我在写C语言程序时结构中的变量是可以随意被访问的,因为没有pulbic,private之分,现在我们是面向对象编程,我们需要在接口处作文章,而保护对象的私有属性,即安全性,只有通过对外公开的接口方法去访问在面向对象理论上认为是安全的。
对象就是属性+行为,封装就是把对象的私有属性封装起来,只有通过自己公开的行为去改变(获得)对象内部的私有属性信息,而那些public的方法正是面向其他对象的接口,只有通过接口去改变(获得)对象的私有属性
2 安全性
设想,你有一个Person类代表一个人,Person有一个char类型的sex字段表示性别,理论上,sex只接受两个值, 'M '和 'F ',但如果你把sex字段设为public,你很难限制你的用户只给它赋 'M '或 'F '值。将sex设为private,再用setSex()来设置性别,你就完全可以控制这种行为了。而且你还可以控制只能get不能set,或相反,但如果是public就不行了。别外有一点属性我们可能并不希望其他用户对我们的属性进行写操作,这个时候,可以直接不写setX方法。这就是只读属性了。
3 编码规范性
我们在设计类,或者作com组件时经常告诉其实coder,你只需要调用我的XX接口方法就可以了,内部我是怎么实现的,你不用管,如果面向特定的环境特定的时间段,直接将属性声明为public,让外部对象访问也未偿不可,没有面象对象思想时,我在写C语言程序时结构中的变量是可以随意被访问的,因为没有pulbic,private之分,现在我们是面向对象编程,我们需要在接口处作文章,而保护对象的私有属性,即安全性,只有通过对外公开的接口方法去访问在面向对象理论上认为是安全的。
追问
那么在很多时候,一个成员没有任何取值范围之类的限制,也同时具有get set,我认为这样和直接写public除了代码多点没有任何区别,为什么我们还是要写成private呢
展开全部
一是编码规范性,大家习惯是这样做,自然有它的道理,你不这样做,也不是不可以,没说一定要设为private再用get和set访问修改。
二是通过接口来访问和修改数据是可控的,相对安全,当你的数据是pubilc的时候,意味着可以随便修改,通常我们不希望给用户随便修改,随便修改可能会导致程序出错,比如你要设置一个年龄,一般都是有一个数据范围的,你就可以人为的过滤掉那些非法的输入,并返回提示,假如你给年龄设置为-1,那在后续的函数处理就可能出错,设计者默认年龄是正数且不会很大,现在来了个负数,就会导致不可预知的结果(难道要在后续每一步涉及年龄的处理中都判断是不是负数,岂不是显得程序很臃肿)。当然你可以在输入的时候先在main函数判断输入是否合理,或者写一个函数判断输入是否合理,再传值给年龄,但是这样不如写个接口设置函数,还简洁一点呢。。。所以总的来说,任何有意义的数据都是有一定表示范围的,所以严格来说写一个接口函数来设置值是必要的,基于这一点设置为private+set就比较重要了。
当然,对于下面这种写法,严格来说没有体现出private的重要性,也是不规范的,很容易就会导致程序出错。
void set(int val)
{
a=val;
}
二是通过接口来访问和修改数据是可控的,相对安全,当你的数据是pubilc的时候,意味着可以随便修改,通常我们不希望给用户随便修改,随便修改可能会导致程序出错,比如你要设置一个年龄,一般都是有一个数据范围的,你就可以人为的过滤掉那些非法的输入,并返回提示,假如你给年龄设置为-1,那在后续的函数处理就可能出错,设计者默认年龄是正数且不会很大,现在来了个负数,就会导致不可预知的结果(难道要在后续每一步涉及年龄的处理中都判断是不是负数,岂不是显得程序很臃肿)。当然你可以在输入的时候先在main函数判断输入是否合理,或者写一个函数判断输入是否合理,再传值给年龄,但是这样不如写个接口设置函数,还简洁一点呢。。。所以总的来说,任何有意义的数据都是有一定表示范围的,所以严格来说写一个接口函数来设置值是必要的,基于这一点设置为private+set就比较重要了。
当然,对于下面这种写法,严格来说没有体现出private的重要性,也是不规范的,很容易就会导致程序出错。
void set(int val)
{
a=val;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你一个人写代码肯定随意咯 ,等你和一堆人写代码的时候,你就会发现,别人随便改的public的值是多痛苦了!前辈们总结的经验还是有道理的 。使用了get/set就能保护你不想被人修改的数据,这种问题你写代码写多了就慢慢明白了 。
追问
但是你定义了get set和直接写public有什么区别呢,别人一样可以随便改啊
追答
private int age;
public void setAge(int age){
if(age<0){
this.age=0;
}else{
this.age=age;
}
}
这是一点,你可以做一些在get和set限制,如果你接触过各类框架,你就会发现很多采用反射机制去自动生成javabean的都需要调用get和set方法,并不是直接修改类中的某个属性。当然并不是说所有属性都是要private的,并没有谁说不许写public的属性啊 !关键还是要看需求,如果你任性,那随便你了,想怎么写就怎么写了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
从简单一点的角度来说,可以限制赋值的范围。
比如有一个Person类,内有一个字段:age,表示年龄,set方法可以写成:
public void setAge(int age)
{
if(age>0)
{
this.age=age;
}
}
当你setAge(-1)时,就可以忽略掉这个不正确的值。
如果age设成public 的话,就起不到这个检查的作用了。
比如有一个Person类,内有一个字段:age,表示年龄,set方法可以写成:
public void setAge(int age)
{
if(age>0)
{
this.age=age;
}
}
当你setAge(-1)时,就可以忽略掉这个不正确的值。
如果age设成public 的话,就起不到这个检查的作用了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询