把成员变量private了,但是方法却是public的,不是一样可以被外部类调用并篡改吗?初学不懂,请高手点拨几下。最好能写出体现封装好处的代码,对比着写并打上注释,谢啦

解决方案 »

  1.   

    封装是为了屏蔽实现,就是我们不需要这个功能是怎样实现的,只要我们知道它的功能,能够干什么,我们直接拿来用就可以了,你说的private修饰成员变量,你可以这样理解,就是你自己有一个年龄,而你的年龄不想让任何人都知道,如果想要知道你的名字,那么就要通过一个方法,而这个方法你可以想成是你是否认识这个人,而这个认识你的方法你不需要管它是怎去实现的。本人愚见。
      

  2.   

    我的理解是①设立public方法,一定是此成员变量需要被外界调用的。②此成员变量不希望被任意修改,所以设成了private。其实并不矛盾,与直接将成员变量public不同,这种方法可以通过修改方法来限制外部的修改public class Person {
    private int age;

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    if(age < 0 || age > 1000)
    throw new RuntimeException("年齡異常");
    this.age = age;
    }
    }通过对age的判断,来决定是否让外界修改age。希望对你理解有帮助-。-
      

  3.   

    字段设为私有,是满足面向对象中封装性,一个类不建议允许直接获取到另一个类的字段,同时也不建议直接把自身字段暴露给另一个类,本质上其实是为了隐藏具体实现,同时,用get或者set方法来获取或者设置的话,可以在该方法中添加一些简单的验证逻辑,比方说有个学生类,其中有个年龄字段,如果直接做成public的话,那么这个年龄字段可以设置为负值,但是你做成了set方法的时候,你调用set设置年龄,那么你可以在set方法中去对为负数的年龄进行验证处理
      

  4.   

    2楼说出了一部分.
    还有一个原因就是只暴露设值函数方便调试维护,在eclipse这样的工具中,我只要ctrl+shift+G就可以查看setAge方法在哪被调用到,从而可以方便跟踪问题,而直接暴露字段,客户端可以肆意操作,如*=,+,-,*,/,=,++等操作,完全查询出有哪些地方修改了该字段是比较困难的.
      

  5.   

    2楼说的很好,基本上是这个样子,public被别人调用,而方法中进行对内部的成员赋值的一种手段,比如不能超过哪些值等等的判断,从而其他地方调用那么也只能遵守封装后的方法,没有办法赋予封装后的类里面成员的一些特殊值.
      

  6.   

    方法不一定都是public的得看你实际的需要来确定,看你想对外暴漏什么信息,允许“客户”知道什么,可以修改什么。
      

  7.   

    方法不一定都是public的得看你实际的需要来确定,看你想对外暴漏什么信息,允许“客户”知道什么,可以修改什么。