一个学生类Student,
有属性:学号no,名字:name
还有对应的get,set方法。我想问下为什么 属性要求是私有的,
或者说
当属性是私有属性时,通过get,set方法修改属性值  

当属性是共有属性时,直接修改属性值有什么区别吗?

解决方案 »

  1.   

    设成私有的话,那访问这个成员的入口只有一个,那对这个成员的访问是处于可控状态下的。如果设成公有的话,那对这个属性就是无法控制的。好比,有一根水管上面有一个洞的话,那我们很快地把它堵上,如果有无数个洞,那后果就可想而知了。再者,想问题能想得再深入一层,比如:什么时间给这个成员设了个什么值,我们需要输出一段日志供以后进行分析用。用 set 方法的话,我们能很方便地做到这一点。如果把这个成员设为 public 的话,你该如何做?
      

  2.   

    单独的一个string name;不能叫属性(property),通常我们把这个叫做域(Field)或成员变量(member variable)。一个域和他的setter/getter加在一起才是一个属性string name;
    string getName() {...}
    void setName(string name) {...}有了这样的属性的类,才叫做bean至于通过getter/setter访问属性,和直接访问public的域之间的区别。
    我想同“我请你付钱”和“我直接从你的钱包里拿钱”之间的区别是一样的。
      

  3.   

    你这个困惑我以前也有过,后来弄明白了,在这里跟你分享一下如果是public类型的话,就可以在其它的类中这样student.age = -100;
    要是通过setter方法再进行赋值的话,就可以对传入的数据进行筛选
    public void setAge(int age) {
    if(0<age<150){
                   this.age = age;//加入逻辑,使得数据符合我们的要求
             }        
    }
      

  4.   

    1大家都这么用(以面向对象的封装性为由)
    2涉及到多线程的时候非常有用
    解释一下2,如果将变量设为public 我们就不能用synchronized去修饰一个变量,这样就不能保证的安全性,
    而通过synchronized去修饰它的gettter和setter的话,就能保证数据的安全,还有5楼所说的一些变量不能办的,而方法却可以办到的事
      

  5.   

    java的三大特点 封装 多态 继承 你所说的就是封装 
      

  6.   

    不是私有的也行呀,只是java的风格就是 get set 更好展现面向对象,封装的特性,不允许用户直接修改其值。