我们一般认为一个数据成员应该是:
class A{
  private boolean flag;
}
如果其它地方也要使用这个flag。那么如何进行读取和设置呢。
直接赋值吗。还是用两个成员方法:
public void set()
public boolean get()
说实话,我觉得这两个方法与直接获得数据成员没有什么区别

解决方案 »

  1.   

    通过get,set方法能很好的隐藏信息
      

  2.   

    private的成员,不可以直接访问,只能通过方法间接访问
    封装特性封装就是将客户端不应看到的信息包裹起来。使内部执行对外部来看是一种不透明的、是一个黑箱,客户端不需要内部资源就能达到他的目的。
    1.事物的内部实现细节隐藏起来
    2.对外提供一致的公共的接口――间接访问隐藏数据
    3.可维护性  
      

  3.   

    public class Person {
        private int age;
        
        public int getAge(){
            return age;
        }
        public void setAge(int value){
            if(value <= 0 || age >= 150){
                throw new ArgumentException ("人的年龄必须大于0且小于150");
            }
            this.age = value;
        }
    }
    也就是说,用方法设置属性值,可以在返回或设置时对实例进行一步的操作,这是直接赋值做不到的另一个原因就是,用 set/get 是一种编程规范,为将来的扩展作准备,可减少模块之间的耦合。
    以楼主的代码为例,如果类 A 已经这样定义好了,并且这个类也已经通过测试、发布,因为楼主的这个类写得很好,有不少同事(包括你自己在内)也在使用这个类,并且很多代码都对类A对象的 flag 属性进行了各种各样的赋值。但是过一段时间之后,由于各种原因(可能需求发生变化,也可能类中有一点小错误),类A需要在它的 flag 属性值发生变化时作一点小动作(比如向数据库插入一条记录、写一个日志等),也可能当类 A 的对象正在做一件工作时必须拒绝将它设置为 true 等等等等。所以,这时你就应该把 flag 属性设置成 private,并为它添加 get/set 的方法。然而,你的同事张三、李四、王五等人的代码中是这样使用类A的:
    A a1 = new A();
    ......
    A a2 = getAInstance();
    ......
    a1.flag = true;
    ......
    a2.flag = false;随着你的 A 这个类的重新发布,由于 flag 是 private 的,所以张三、李四、王五这些同事都必须修改他们的代码为
    a1.setFlag(true);
    a2.setFlag(false);
    才能通过编译。你的同事会骂你,项目经理也会BS你,项目可能会因此重新测试而使工期延长,你的奖金没准也会因为这个原因被扣掉一部分
      

  4.   

    把数据成员做成似有的,能很好的利用JAVA的封装特性,外部想要访问这个数据成员,就必须要通过set,get方法来,而set,get方法是我们自己写的,所以这样能很好的控制外部得到的数据。
      

  5.   

    private的成员,不可以直接访问,只能通过方法间接访问
    封装特性封装就是将客户端不应看到的信息包裹起来。使内部执行对外部来看是一种不透明的、是一个黑箱,客户端不需要内部资源就能达到他的目的。
    1.事物的内部实现细节隐藏起来
    2.对外提供一致的公共的接口――间接访问隐藏数据
    3.可维护性  
      

  6.   

    建议楼主好好的看看JAVA基础。
      

  7.   

    非常感谢各位的角释,可是如果set和get只是简单的一句话:
    set
    就是单纯赋值。
    get
    就是单纯取值。
    那么就与public数据成员无异,是吗?
      

  8.   

    如果直接访问flag 和
    public void setFlag(int flag ){
            this.flag = flag ;

    如果单纯这么写,两个是一样的。但在一般的应用中,setFlag可以为赋值加一些判断(就算现在不需要判断,将来可能也需要),而不是直接赋值。
    比如
    public void setFlag(int flag ){
            if(flag>1000)
            {
            this.flag = 1000 ;
             }else
            {this.flag=flag
             }

    这样就可以控制flag不超过1000.
      

  9.   

    你实在要这样做,其实也没什么关系,只是如果像我在前面回帖中说的那样,如果哪一天这个被随意存取的属性在它的值发生变化时要进一些动作,那要修改的可就不是你这个类中的代码了,你会连累很多人修改他们的程序。另外,把属性做成 get/set 的方式也是一种好的编程习惯,虽然没有强制你该如何做,但这也是一种习惯。就象一个大男人穿条花花的连衣裙逛商场,虽然大家不习惯,但他也没犯哪家王法。
      

  10.   

    将属性设置成private,然后通过set和get方法访问的话,就能把属性的read权限和write权限分开了。
    比如:
    private String name;
    protected void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    你觉得这样的代码,和直接将name属性定义成public是一样的么?
    而直接访问属性的方式,读与写的权限都是一样的。
      

  11.   

    嘿嘿楼主的意思是说,当 getter 和 setter 方法都是 public 的情况下,直接把 name 设置成 public,这样省事,无论对这个类的开发者还是使用者。
      

  12.   

    单从维护性方面比较一下把 name 设置成 public,随便改写的话
    如果有100个地方都用到了name 
    现在要求把name后面加上一个字符串,100个地方要改100遍
    如果用set,get方法,直接在方法中加一句就搞定了
      

  13.   

    我同学也有这样的疑惑。
    我仔细看了下SUN公司的API
    set和get方法。
    都不是单纯的数据录入与读出。
    还是有一定的处理。如:JFileChooser的
        public void setAccessory(JComponent newAccessory) {
            JComponent oldValue = accessory;
            accessory = newAccessory;
    firePropertyChange(ACCESSORY_CHANGED_PROPERTY, oldValue, accessory);
        }
      

  14.   

    用属性的一种好处:
    public class A {
      private int width; 
      private int height;
      // with getters & setters for width & height
      public int getArea() {
        return width * height; 
        // 如果把area做成字段,你需要分别设置,而且还可能造成面积与长宽不一致
        // 甚至可以写更复杂的代码,例如switch-case, 读取数据库
      }
    }
    写属性也有类似功能,具体参考http://topic.csdn.net/u/20091201/15/d5950537-f3a0-4bdd-9718-309517f2c783.html中我的回复
      

  15.   

    小灰狼好N,能认识你下吗?我的QQ:544059459
      

  16.   

    可以再类里面创建一个方法来改变flag的值
      

  17.   

    说来说去,就是觉得
    数据成员公有多好。
    还要多十来行代码写set和get相当麻烦。
      

  18.   

    java使用三个关键字来在类的内部设定边界:public、private、protected。public表示紧随其后的元素对任何人都是可用的,private表示除类本身和该类内部方法之外的任何人都不能访问的元素、protected关键字与private作用相当,差别仅在于继承类可以访问protected成员,但是不能访问private成员。另外,Java还有一种缺省的访问权限,但没有使用指定关键字时,其权限为“包访问权限”,因为在这种权限下,类可以访问在同一个包中的其他类的成员,但是在包之外,这些成员如同private一样。static: 一个static域对每个类来说都只有一份存储空间,即相当于常量,使用时不需要创建任何对象。而非static域则是对每个对象有一个存储空间,使用时必须创建对象。
      

  19.   

    public class Person {
        private int age;
       
        public int getAge(){
            return age;
        }
        public void setAge(int value){
            if(value <= 0 || age >= 150){
                throw new ArgumentException ("chinese wholesalers");
            }
            this.age = value;
        }
      

  20.   

    看看单例模式,看看其中的private,public。然后再想想get,set
    class A{
       private static A _instance;
       private A(){
       }
       public static A getInstance(){
          if(_instance == null){
           _instance = new A();
           
          }
          return _instance;
       }
    }
      

  21.   

    有区别哈!~ public 这是表示公共的属性 其它的类都能访问 虽然方便但是安全性不好
                 private 表示私有的 通过get set方法访问 这样的效果 安全多了不!~
      

  22.   

    那个类A不申明为public,其他类不能随便调用里面的变量吧
      

  23.   

    答:44楼,这与单例模式无关的吧。
    答:42楼,参数是int型的确是有这种好处。但如果只是一种对象类型,你有什么好检查的。
    只是单纯的赋值和取值,我觉得本身就没有封装性。(这虽然是一个非常简单的问题,但既然已经谈到这个份上了,我们就把这个问题说透了,以供小虾们参考)
    调用有三种方法:[我自己写的,大家请批)1)在本对象中,生成另一个对象的引用,再利用这个引用去调用public方法,再利用此方法获得数据。2)设对方的方法为静态方法,这样直接可以用类名来调用。这也就是说这个方法相当于一个全局方法,当这个方法比较独立和稳定,而又经常被调用到时,这种做法还是可取的。但如果可以使用实例方法的情况下,大量使用这种方式去调用,会造成资源浪费,因为实例方法在执行之后,就会退出内存。即使不被马上回收。3)直接设置对方的数据成员为public,实现数据的直接存取。大部的初级程序员都是这么做的,致使数据成员象全局变量一样,到处都被使用,最后处于环状,五角星状调用,使程序可读性,可维护性大大降低。
      

  24.   

    这说明你还没有真正理解面向对象语言的优点如果你图方便省事,想少写几行代码,还不如让java把private关键字去掉,只允许有public类型的属性。这样的程序设计语言一样可以开发出好的系统来