本来private的意义在于保护,类实例只能通过public方法对其修改。但是通过public方法拿到private对象的引用,即可对其进行修改,如:public Class Student{
   private int age;
   public void setAge(age){....}
   .....
}public Class StudentManager{
    private Student stu;
    public Student getStudent(){return stu;}
    .....
}main:
  StudentManager sm = new StudentManager();
  Student  stu=sm.getStudent();
  stu.setAge(10);    通过getStudent()拿到private的stu之后,就可以对stu进行随便修改,是不是违背了private的本意??

解决方案 »

  1.   

    不用setAge你能对其经行修改?当然在不用反射的前提下
      

  2.   

    private的本意是不让你改那个变量对值的引用,至于它引用了的那个东西,自然是管不着了。你说的这个问题已经属于比较高端的了。当你不想外部代码修改你的内部成员,解决方法有两种:
    1. Defensive Copy:说的是你不能返回对你想保护的对象的引用,即stu,但是你可以返回一个stu的镜像,也就是你写return (Student) (stu.clone()),这样外部就能获得stu的所有值,但是它们对这个clone所做的任何事都不会影响到stu本身。当然,如果stu内部也包含了类似的返回值,同样要用clone2. Forwarding:你在StudentManager里面实现Student的所有你想让外部调用方法,而方法里面只有一句话。比如你想让外部调用getAge(),那你就在StudentManager里面写 public int getStuAge() { return stu.getAge(); }。当然,getStudent这个方法是要去掉的。另外“Forwarding”这个名字是我自己乱编的,前面的Defensive Copy是借用了Effective Java里的命名
      

  3.   

    你如果 真想让他不能修改,哪你就连可以访问它的方法也不要提供了,只要你觉得有意义。java这么做一般也是为了让外部不直接访问成员,而是访问方法。
      

  4.   

    private成员的本意并不是你想到那样。
      

  5.   

    LZ可能要深入一下Java的封装性,一般在类中的成员变量是private的,如果需要开放给外部调用,则可以提供public方法,外部只能通过这个public方法才能访问这些成员变量,这个不存在安全性的问题,如果你实在不希望外部更改这些成员变量,可以不提供public方法,或者也是privatede,只能你类内部使用,不过一般的业务需求是需要你提供这些public方法给调用的,不然不能与你的业务系统进行交互,开不开放访问调用取决于你具体的业务需求,你是可以控制的,安全性也不成问题。
      

  6.   

    封装可不是一个private就能搞定的,并且我感觉封装是相对的,要看你要达到什么效果。
      

  7.   

    private不是不可改,是不可见。不可改用final
      

  8.   

    即使用final也阻止不了lz所说的那种修改。打个比方你就明白,比方说你的类是一个学籍管理系统,你可以通过getStudent来“取出”某个学生,那么如果你只写get不写set代表什么意思呢?表示你不能冒名顶替,不能把小明换成小红。但是,它并不拒绝用setAge将小明变成10岁,即便你用setName把“小明”改名叫“小红”,但是他的本质还是小明这个人,这就是所谓“只读”。
      

  9.   

    即使用final也阻止不了lz所说的那种修改。打个比方你就明白,比方说你的类是一个学籍管理系统,你可以通过getStudent来“取出”某个学生,那么如果你只写get不写set代表什么意思呢?表示你不能冒名顶替,不能把小明换成小红。但是,它并不拒绝用setAge将小明变成10岁,即便你用setName把“小明”改名叫“小红”,但是他的本质还是小明这个人,这就是所谓“只读”。
    唉~~, 你不会举一反三吗? 如果name 和 age 也不想被改, 申明的时候一样,加上final
      

  10.   

    即使用final也阻止不了lz所说的那种修改。打个比方你就明白,比方说你的类是一个学籍管理系统,你可以通过getStudent来“取出”某个学生,那么如果你只写get不写set代表什么意思呢?表示你不能冒名顶替,不能把小明换成小红。但是,它并不拒绝用setAge将小明变成10岁,即便你用setName把“小明”改名叫“小红”,但是他的本质还是小明这个人,这就是所谓“只读”。
    唉~~, 你不会举一反三吗? 如果name 和 age 也不想被改, 申明的时候一样,加上final
    首先,你要明白是谁在求助,是lz在求助不是我。第二你要明白lz疑惑的到底是什么,你的回答毫无疑问是正确的,但没有起到解除lz疑惑的作用
      

  11.   

    你不写set方法就没法对private改了呗
    private的访问权限是该类,除了当前类能使用,其他都不能,也就是说,你这个private变量被修改,是由于你当前类的public方法引起的,而不是它本身。
      

  12.   

    即使用final也阻止不了lz所说的那种修改。打个比方你就明白,比方说你的类是一个学籍管理系统,你可以通过getStudent来“取出”某个学生,那么如果你只写get不写set代表什么意思呢?表示你不能冒名顶替,不能把小明换成小红。但是,它并不拒绝用setAge将小明变成10岁,即便你用setName把“小明”改名叫“小红”,但是他的本质还是小明这个人,这就是所谓“只读”。
    唉~~, 你不会举一反三吗? 如果name 和 age 也不想被改, 申明的时候一样,加上final
    首先,你要明白是谁在求助,是lz在求助不是我。第二你要明白lz疑惑的到底是什么,你的回答毫无疑问是正确的,但没有起到解除lz疑惑的作用即使用final也阻止不了lz所说的那种修改。打个比方你就明白,比方说你的类是一个学籍管理系统,你可以通过getStudent来“取出”某个学生,那么如果你只写get不写set代表什么意思呢?表示你不能冒名顶替,不能把小明换成小红。但是,它并不拒绝用setAge将小明变成10岁,即便你用setName把“小明”改名叫“小红”,但是他的本质还是小明这个人,这就是所谓“只读”。
    唉~~, 你不会举一反三吗? 如果name 和 age 也不想被改, 申明的时候一样,加上final
    首先,你要明白是谁在求助,是lz在求助不是我。第二你要明白lz疑惑的到底是什么,你的回答毫无疑问是正确的,但没有起到解除lz疑惑的作用你说的很有道理,不过你怎么知道我没解除楼主的疑惑?