封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。系统的其他对象只能通过包裹在数据外面的已经授权的操作来与这个封装的对象进行交流和交互。也就是说用户是无需知道对象内部的细节(当然也无从知道),但可以通过该对象对外的提供的接口来访问该对象。

对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。

使用封装有三大好处:

1、良好的封装能够减少耦合。
2、类内部的结构可以自由修改。
3、可以对成员进行更精确的控制。
4、隐藏信息,实现细节。

先来看两个类:Husband.java、Wife.java

public class Husband {  /* * 对属性的封装 * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 */  private String name ;  private String sex ;  private int age ;  private Wife wife;  /* * setter()、getter()是该对象对外开发的接口 */  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  public String getSex() {  return sex;  }  public void setSex(String sex) {  this.sex = sex;  }  public int getAge() {  return age;  }  public void setAge(int age) {  this.age = age;  }  public void setWife(Wife wife) {  this.wife = wife;  }
}  

public class Wife {  private String name;  private int age;  private String sex;  private Husband husband;  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  public String getSex() {  return sex;  }  public void setSex(String sex) {  this.sex = sex;  }  public void setAge(int age) {  this.age = age;  }  public void setHusband(Husband husband) {  this.husband = husband;  }  public Husband getHusband() {  return husband;  }  }  

从上面两个实例我们可以看出Husband里面wife引用是没有getter()的,同时wife的age也是没有getter()方法的。至于理由我想各位都懂的,男人嘛深屋藏娇妻嘛,没有那个女人愿意别人知道她的年龄。

所以封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果不想被外界方法,我们大可不必提供方法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。比如我们将一个房子看做是一个对象,里面的漂亮的装饰,如沙发、电视剧、空调、茶桌等等都是该房子的私有属性,但是如果我们没有那些墙遮挡,是不是别人就会一览无余呢?没有一点儿隐私!就是存在那个遮挡的墙,我们既能够有自己的隐私而且我们可以随意的更改里面的摆设而不会影响到其他的。但是如果没有门窗,一个包裹的严严实实的黑盒子,又有什么存在的意义呢?所以通过门窗别人也能够看到里面的风景。所以说门窗就是房子对象留给外界访问的接口。

通过这个我们还不能真正体会封装的好处。现在我们从程序的角度来分析封装带来的好处。如果我们不使用封装,那么该对象就没有setter()和getter(),那么Husband类应该这样写:

public class Husband {  public String name ;  public String sex ;  public int age ;  public Wife wife;
}  

我们应该这样来使用它:

        Husband husband = new Husband();husband.age = 30;husband.name = "张三";husband.sex = "男";    //貌似有点儿多余

但是那天如果我们需要修改Husband,例如将age修改为String类型的呢?你只有一处使用了这个类还好,如果你有几十个甚至上百个这样地方,你是不是要改到崩溃。如果使用了封装,我们完全可以不需要做任何修改,只需要稍微改变下Husband类的setAge()方法即可。

public class Husband {  /* * 对属性的封装 * 一个人的姓名、性别、年龄、妻子都是这个人的私有属性 */  private String name ;  private String sex ;  private String age ;    /* 改成 String类型的*/  private Wife wife;  public String getAge() {  return age;  }  public void setAge(int age) {  //转换即可  this.age = String.valueOf(age);  }  /** 省略其他属性的setter、getter **/  

其他的地方依然那样引用(husband.setAge(22))保持不变。

到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码

我们在看这个好处:可以对成员变量进行更精确的控制。

还是那个Husband,一般来说我们在引用这个对象的时候是不容易出错的,但是有时你迷糊了,写成了这样:

Husband husband = new Husband();
husband.age = 300;  

也许你是因为粗心写成了,你发现了还好,如果没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!

但是使用封装我们就可以避免这个问题,我们对age的访问入口做一些控制(setter)如:

public class Husband {/** 对属性的封装* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性*/private String name ;private String sex ;private int age ;    /* 改成 String类型的*/private Wife wife;public int getAge() {return age;}public void setAge(int age) {if(age > 120){System.out.println("ERROR:error age input....");    //提示錯誤信息}else{this.age = age;}}/** 省略其他属性的setter、getter **/}

上面都是对setter方法的控制,其实通过使用封装我们也能够对对象的出口做出很好的控制。例如性别我们在数据库中一般都是已1、0方式来存储的,但是在前台我们又不能展示1、0,这里我们只需要在getter()方法里面做一些转换即可。

public String getSexName() {  if("0".equals(sex)){  sexName = "女";  }  else if("1".equals(sex)){  sexName = "男";  }  else{  sexName = "人妖???";  }  return sexName;  }  

在使用的时候我们只需要使用sexName即可实现正确的性别显示。同理也可以用于针对不同的状态做出不同的操作。

public String getCzHTML(){  if("1".equals(zt)){  czHTML = "<a href='javascript:void(0)' οnclick='qy("+id+")'>启用</a>";  }  else{  czHTML = "<a href='javascript:void(0)' οnclick='jy("+id+")'>禁用</a>";  }  return czHTML;  }  

转载于:https://www.cnblogs.com/hwaggLee/p/4491510.html

Java基础-四要素之一《封装》相关推荐

  1. java方法四要素_Java基础语法

    Free Talk 最近在JavaGuide博客里面兜兜转转了几天,一边等华为的实训消息,一边随便看点Java后端开发的知识.但是这一周总感觉看了就忘,而且光看也很容易走神发呆,要不然就是去打王者啥的 ...

  2. 《温故而知新》JAVA基础四

    类的封装 定义:将类的一些信息隐藏起来,不允许外部的程序直接的访问,而是通过该类提供的一些方法来获取 好处:只能通过特定的法方法访问数据,保护了数据, 实现封装的步骤: 修改属性的可见性:(一般类属性 ...

  3. java基础----(三大特性:封装,继承,多态)

    封装 将对象的转态信息隐藏在对象内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对内部信息的访问和操作. 封装的好处: 隐藏类的实现细节 使用者只能通过事先预定的方法来访问数据,从而可以在该 ...

  4. Java基础四——面向对象思想

    1.1 什么是面向对象 面向对象思想就是不断的创建对象(属性与行为的封装,让二者作为整体参与程序执行),使用对象,指挥对象做事情.(在已有对象的情况下,直接使用对象,而不再去考虑对象的内部构造) 面向 ...

  5. Java基础知识回顾之三 ----- 封装、继承和多态

    前言 在上一篇中回顾了java的修饰符和String类,这篇就来回顾下Java的三大特性:封装.继承.多态. 封装 什么是封装 在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装 ...

  6. Java基础-OOP特性之封装、继承、多态、抽象

    为什么80%的码农都做不了架构师?>>>    //要习惯将程序(功能.代码)模块化 //OOP四大特性:封装.继承.多态.抽象 //OOP的核心:封装一个类,把数据抽象出来,再把方 ...

  7. java基础(四) java运算顺序的深入解析

    1. 从左往右的计算顺序   与C/C++不同的是,在Java中,表达式的计算与结果是确定的,不受硬件与环境的影响.如: int i = 5; int j = (i++) + (i++) +(i++) ...

  8. 【4】 Java基础 四

    构造方法,可以有多个. 1 public class phone { 2 //属性 3 private String name = "华为"; 4 5 6 //方法 或者叫函数 7 ...

  9. java基础第五篇封装与面向对象

    a.方法: public static void main(String[] args) { } 一般定义标准: 形参:一般把 不确定的量或者变化的量定义在形参位置//圆的的半径,长方形的长和宽,传递 ...

最新文章

  1. 两分公支的IPSec***流量走总部测试
  2. 【转载】CMake 简介和 CMake 模板
  3. ArrayList分析
  4. 一文搞定哈希(六种构建、四种冲突解决方法、查找算法总结)
  5. UVA10227 POJ2419 ZOJ1900 Forests【并查集+set】
  6. 设置java heap_JAVA HEAP SPACE解决方法和JVM参数设置
  7. ajax的param方法,jQuery ajax - param() 方法
  8. DOTween中文详解(持续更新)
  9. 计算机指令load是什么意思,overload
  10. CentOS修改时间和时区
  11. 计算机c语言入门.ppt,计算机c语言入门经典
  12. 新唐 N76E003 单片机8051汇编 PWM测试程序
  13. 使用tensorflow2.x实现VGG
  14. 远程桌面启动安卓模拟器
  15. MyBatis(一)MyBatis概述
  16. javascript事件触发器
  17. 毕业半年,买了一台MacBook Pro
  18. Java static与final详细讲解
  19. 网络安全检测与防范 练习题(三)
  20. 阿里云服务器4核8G配置CPU性能报价表

热门文章

  1. 一文读懂P Quant与 Q Quant ,量化交易与金融工程
  2. matlab freqz函数使用
  3. Labview串口通信
  4. centos7编译安装mysql5.7_在Centos7源码包编译安装MySQL5.7
  5. 进去springstrap显示无响应_2020年,28寸IPS面板4K显示器合集,推荐几款代表性的...
  6. java 类对象可以调用静态方法吗
  7. 013_SpringBoot视图层技术thymeleaf-迭代遍历
  8. 047_输出一下byte的所有值
  9. 016_Redis集群的删除和添加节点
  10. linux的du和df命令,du和df命令都是Linux系统的重要工具