你真的理解Java面向对象封装么?

L先生小迷弟 2017-09-19 03:09:35
今天不知从哪里听到一嘴java的封装,觉得对这个概念还没吃透,想请教下各位坛友:
java的封装的好处理解的就两点:
1.方便修改.例如写一个年龄,本来是int类型,但想改为String类型,如果程序中出现多次工作量将会很大,只用修改类中的set方法.
2.可以对成员进行更精确的控制.例如将年龄的取值范围约定在100岁以内,超过100岁会给出提示信息.

排除掉上面的两个好处.

我对于封装的本质内容没有理解,
1.什么叫隐藏信息?外界不还是可以通过new一个对象(这里不多考虑其他创建对象方式),然后直接调用其中的属性或者方法么,某种意义上来说,对外不是公开的么,只需要多一个创建对象的步骤啊
2.我们可以只给一个类中的属性只提供getter方法而不提供setter方法,但是作为一个开发人员,不是随时可以往里面加一个setter方法么,那这样的意义是什么?或者他面向的对象是不是指的不是我们开发人员?
3.封装如何减少耦合?

希望结合实际情景说明下!
...全文
367 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
李德胜1995 2017-09-19
  • 打赏
  • 举报
回复
引用 1 楼 yuxiangaaaaa 的回复:
1、隐藏信息就是利用private修饰成员变量,把类的属性隐藏起来,只有内部才能访问成员变量 然后提供public方法让别的类调用和修改属性
public class Person
{
  //使用 private 修饰成员变量, 将这些成员变量隐藏起来
  private String name;
  private int age;
  //提供方法来操作 name 成员变量
  public void setName(String name)
  {
    //执行合理性验证,要求用户名必需在 2~6 位之间.
    if(name.length() > 6 || name.length() < 2)
    {
      System.out.println("您设置的人名不符合要求!");
      return;
    }
    else
    {
      this.name = name;
    }
  }
  //提供方法来操作 age 成员变量
  public void setAge(int age)
  {
    //执行合理性验证,要求用户年龄必须在 0~100 之间
    if(age > 100 || age < 0)
    {
      System.out.println("您设置的年龄不合法!");
      return;
    }
    else
    {
      this.age = age;
    }
  }
}
定义了上面的 Person 类之后, 该类的 name 和 age 两个成员变量只有在 Person 类的内部 才可以操作和访问. 在 Person 类之外只能通过其对应的 setter 和 getter 方法来操作和访问它们. setter方法和getter方法是公开的,但是调用的时候,可以添加自己的判断条件,就是只放开一部分权限,不是说你可以随便塞个值进去的,具体的值合不合理,还要确认一下。 2、一个大的项目是好多人完成的,分工不同,一个人A负责创建javabean实体类就向上面这样,然后提供了setter方法和getter方法,或者只提供getter方法而不提供setter方法,用到这个类的时候可能就是另一个人B在开发了,B是不能随便改这个人写的代码的(这样容易把代码搞乱的),如果需要setter方法和getter方法,就会要求A提供给B这些方法,这是同一个系统之间两个技术人员的开发。也可能是和另外的系统合作开发,你的代码会让别人修改吗? 如果仅仅是一个人完成的系统,可以修改所有代码的话,就是你想象的情况了。 3、耦合就是代码之间的契合度,耦合很强的时候,就会牵一发动全身,改动一个类,就会相应关联的好多类都要修改了。 封装类一般都是独立的,因为这样的封装类要求是改动量小,改动次数也少,所以该类对其他类的影响就小了,减少了耦合。
自由自在_Yu 2017-09-19
  • 打赏
  • 举报
回复
1、隐藏信息就是利用private修饰成员变量,把类的属性隐藏起来,只有内部才能访问成员变量 然后提供public方法让别的类调用和修改属性
public class Person
{
  //使用 private 修饰成员变量, 将这些成员变量隐藏起来
  private String name;
  private int age;
  //提供方法来操作 name 成员变量
  public void setName(String name)
  {
    //执行合理性验证,要求用户名必需在 2~6 位之间.
    if(name.length() > 6 || name.length() < 2)
    {
      System.out.println("您设置的人名不符合要求!");
      return;
    }
    else
    {
      this.name = name;
    }
  }
  //提供方法来操作 age 成员变量
  public void setAge(int age)
  {
    //执行合理性验证,要求用户年龄必须在 0~100 之间
    if(age > 100 || age < 0)
    {
      System.out.println("您设置的年龄不合法!");
      return;
    }
    else
    {
      this.age = age;
    }
  }
}
定义了上面的 Person 类之后, 该类的 name 和 age 两个成员变量只有在 Person 类的内部 才可以操作和访问. 在 Person 类之外只能通过其对应的 setter 和 getter 方法来操作和访问它们. setter方法和getter方法是公开的,但是调用的时候,可以添加自己的判断条件,就是只放开一部分权限,不是说你可以随便塞个值进去的,具体的值合不合理,还要确认一下。 2、一个大的项目是好多人完成的,分工不同,一个人A负责创建javabean实体类就向上面这样,然后提供了setter方法和getter方法,或者只提供getter方法而不提供setter方法,用到这个类的时候可能就是另一个人B在开发了,B是不能随便改这个人写的代码的(这样容易把代码搞乱的),如果需要setter方法和getter方法,就会要求A提供给B这些方法,这是同一个系统之间两个技术人员的开发。也可能是和另外的系统合作开发,你的代码会让别人修改吗? 如果仅仅是一个人完成的系统,可以修改所有代码的话,就是你想象的情况了。 3、耦合就是代码之间的契合度,耦合很强的时候,就会牵一发动全身,改动一个类,就会相应关联的好多类都要修改了。 封装类一般都是独立的,因为这样的封装类要求是改动量小,改动次数也少,所以该类对其他类的影响就小了,减少了耦合。

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧