今天终于明白了为什么有get和set方法。使用get和set方法是为了程序的封装,为了其它的类可以使用(设置和获取)该类的私有方法。虽然明白了,但是还是不知道到底有什么好处。为什么要封装?使用get和set方法,把简单的事情搞的很复杂了。直接把变量定义为public不就可以了吗?为啥要封装呢?

解决方案 »

  1.   

    参考:http://blog.csdn.net/michaellufhl/archive/2010/09/14/5884694.aspx
      

  2.   

    比如说反射或是其他一些需要结合配置文件才能起作用的工程,get set方法的作用就明显起来了。
    通过get set方法,你可以让把变量私有化,只暴露方法。
      

  3.   

    比如你想在 取值赋值 时 添加其他操作,那么直接在get set方法里添加就ok了,多方便
    比如你想外部类只能get,只允许类内部赋值,那么只开放get方法就ok了,封装性考虑
    比如你想限制成员变量的可访问范围,用get set方法更加方便,编译时虚拟机还能自检禁止直接对成员变量赋值 还有一个重要原因 想不起来了
      

  4.   

    直接把变量定义成public你觉得好吗?
      

  5.   

    封装的一个最主要的用途就在于:数据的安全性。如果像你所说的,所有的属性都用public来修饰,在操作性上是可行的。但是这样的数据时非常不安全的。比如:你在定义浏览器中的默认的每一页中显示的数据为10行数据,你用public去修饰了,我就可以通过new一个类的对象去修改你的这个默认值。但是你用private去修饰时(也就是对其进行了封装),你要setter和getter去改变,改变的只是你new出来的对象,原先的数据时没有变的,这样才是安全的。
      

  6.   

    楼上的解释很好的回答了set和get的区别
      

  7.   

    数据的安全性
    做开发时,这也成为一种定律了,很多时候javabean就需要这么严格定义的
      

  8.   

    你要setter和getter去改变,改变的只是你new出来的对象,原先的数据时没有变的,这样才是安全的。
    8楼的解释有点问题啊,你不管哪种方式,改变的的都是对象的值,除非你的变量是静态的
      

  9.   

    封装的一个最主要的用途就在于:数据的安全性。如果像你所说的,所有的属性都用public来修饰,在操作性上是可行的。但是这样的数据时非常不安全的。比如:你在定义浏览器中的默认的每一页中显示的数据为10行数据,你用public去修饰了,我就可以通过new一个类的对象去修改你的这个默认值。但是你用private去修饰时(也就是对其进行了封装),你要setter和getter去改变,改变的只是你new出来……
      

  10.   

    封装才能体现面向对象的编程思想,如果你把每个属性都使用public进行获取和设置,那样的话属性一旦多的话,看上去也会很乱,如果封装起来的话可以抽象出一个类来表示,所有的属性get和set方法写出来,在用到的地方直接用get方法获取,而且在逻辑层的判断也会很清晰。面向对象编程思想!
      

  11.   

    你家的钱能设为public?
    那你邻居岂不是想拿就拿
    用get的话,你可以在里面做逻辑判断,如果不是你家人就不让拿
    懂?
      

  12.   

    楼上说的都不错,我再说说自己的看法:
    ①成员变量声明为private是封装性的体现,你可以通过对象的公开方法改变对象的属性,但是拒绝直接改变对象的属性。
    ②比如说有个类要实现实现线程安全,他的某个成员变量可能不允许并发修改,使用set方法可以给set上锁,保证只有一个线程可以修改该成员变量,使用set方法方便以后进行线程安全的扩展。当让扩展采用get set方法的扩展是体现在很多方面的,以上只是一例。
    ③Achilles_Dynasty兄台所言方便反射调用,这个不敢苟同,反射是可以直接访问私有变量的。
      

  13.   

    如果都是public了别人就可以用了么?我只是发布在我的服务器上啊?别人怎么用啊?
      

  14.   

    8楼的解释不完全同意。
    任何new出来的对象都有一个作用域,里面成员变量的值改变了,只是影响到该作用域,除非是类静态变量。
      

  15.   

    最简单来说,假如你只想让别人读属性,只用public,那么任何人都可以更改变量,如果用set封装,别人就没办法改了。
      

  16.   

    说白了,你传进和传出的参数都是需要相关的方法的接收和发出的,其实用什么方法都可以,但是这样会造成方法不统一,比如你以后用几个框架有的规定用set有的规定用st那不就乱了吗!所以j2ee规范了它,必须用set 和get,
      

  17.   

    在类中为属性增加set、get方法后,该类就成为一个java bean,这样做好处有很多:
    1、数据封装,避免直接访问属性,可以在set、get方法中增加逻辑,比如在set方法中进行数据校验,防止设置非法数据。
    2、java bean与反射结合,是框架中常用的技术,比如hibernate中将表中的数据映射成pojo bean对象、struts将表单数据封装到form bean对象、Spring中将数据注入到bean对象中。
    3、jdk中提供了工具类BeanUtils,该工具类提供了很多操作bean对象的接口,使用它操作bean对象很简单。
      

  18.   


    你举的例子并不能说明问题,如果用public来修饰,new 一个类的对象,再去修改这个值,并不会影响这个类的其他实例对象的这个值,因为public 修饰的并不是static,并不会产生共享,与你所说的用get,set是完全一样,get ,set确实有做封装作用,但是并不是每一个字段都需要为其加上get,set方法,有时可能只加get,有时也只加set,具体看情况而定,比如一个用户登录,可能在密码字段上,只有set方法,并不为其添加get方法
      

  19.   


    你举的例子并不能说明问题,如果用public来修饰,new 一个类的对象,再去修改这个值,并不会影响这个类的其他实例对象的这个值,因为public 修饰的并不是static,并不会产生共享,与你所说的用get,set是完全一样,get ,set确实有做封装作用,但是并不是每一个字段都需要为其加上get,set方法,有时可能只加get,有时也只加set,具体看情况而定,比如一个用户登录,可能在密码字段上,只有set方法,并不为其添加get方法
    +1
      

  20.   

    Java面向对象特性之一就是封装,一个类的字段应该只能被这个类本身所识别,所以要用private修饰字段,而用了private修饰的字段,就需要提供set()、get()方法外部才能访问,如果使用public修饰字段,java中包的访问权限就没有意义了,封装特性也太不体现了。