封装

  • 1 什么是封装
  • 2 封装的好处
  • 3 getter 和 setter 方法

1 什么是封装

封装的本质就是让类的调用者不必太多的了解类的实现者是如何实现的, 只要知道如何使用类就行了, 这样就降低了类使用者的学习和使用成本, 也降低了代码的复杂程度.

  • 被 public 修饰的成员变量或者成员方法, 可以直接被类的调用者使用;
  • 被 private 修饰的成员变量或者成员方法, 不能被类的调用者使用.
    总之, 封装就是用 private 来修饰属性或者方法, 类的使用者根本不需要知道也不需要关注一个类有哪些 private 的成员, 从而让调用者 以更低的成本来使用类.

2 封装的好处

如果直接使用 public , 如下代码所示:

class Human {public String name = "Lee";public String sex = "男";public int age = 25;
}
public class demo2 {public static void main(String[] args) {Human human = new Human();System.out.println("我的名字叫 " + human.name + ", 性别 " + human.sex + ", 今年 " + human.age + "岁!");}
}

运行结果:

代码解读:

  • 类的使用者必须要清楚 Human 类内部的实现才能够使用这个类, 学习成本高;
  • 一旦类的实现着修改了代码, 也就是 Human 类中的 name 改成了 names, name类的调用者就需要大规模的修改自己的代码, 维护成本比较高.

因此, 我们可以使用 private 来封装属性, 并提供 public 方法来供类的调用者来使用. 代码如下:

class Humans {private String name = "Lee";private String sex = "男";private int age = 25;public void show() {System.out.println("我的名字叫 " + name + ", 性别 " + sex + ", 今年 " + age + "岁.");}
}
public class demo3 {public static void main(String[] args) {Humans humans = new Humans();humans.show();}
}

运行结果:

代码解读:

  • 此时name 字段等使用 private 来修饰, 这时候类的调用者就不能直接使用 name, sex, age 这几个字段, 也就是 main 方法中不能直接使用他们, 而是借助 show()来实现, 此时类的使用者就不必了解 Humans 类的实现细节;
  • 如果类的实现者修改了字段的名字, 类的调用者也不需要进行修改, 因为调用者根本就访问不到 name, sex, age 这几个字段;
  • private 不光能修饰字段, 也能修饰方法;
  • 通常情况下我们会把字段设置为 private 属性, 但是方法是否需要设为 public, 就需要视情况而定了, 一般我们希望一个类只提供必要的 public 方法, 而不应该是把所有的方法都设为 public.

3 getter 和 setter 方法

 如上 2 中的代码, 如果在main 方法中直接对 name 等字段进行赋值是不可取的, 例如 humans.age = 19; humans.show(); 这时候代码就会报错, 如下所示:

因此如果想要进行对其赋值就必须使用 getter / setter 方法, 代码如下所示

class Humans {private  String name = "Lee";private  String sex = "男";private  int age = 25;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 show() {System.out.println("我的名字叫 " + name + ", 性别 " + sex + ", 今年 " + age + "岁.");}
}
public class demo3 {public static void main(String[] args) {Humans humans = new Humans();humans.show();System.out.println("===================");humans.setName("Fug");humans.setAge(19);humans.setSex("man");humans.show();}
}

运行结果:

注意事项:

  • 当 set 方法中的形参名字和类中的成员属性的名字一致的时候, 如果不使用 this, 相当于自赋值, this 表示当前实例的引用;
  • 不是所有的字段都一定要提供 setter / getter 方法, 要根据实际情况来决定提供哪种方法.

Java 基础系列(一) --- 对封装的理解相关推荐

  1. 夯实Java基础系列23:深入理解Java继承、封装、多态的底层实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  2. 夯实Java基础系列9:深入理解Class类和Object类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  3. [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理

    参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...

  4. 夯实Java基础系列11:深入理解Java中的回调机制

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. 夯实Java基础系列18:深入理解Java内部类及其实现原理

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  6. 夯实Java基础系列14:深入理解Java枚举类

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. Java基础系列五 面向对象程序设计

    Java基础系列第一章 初识Java语言 Java基础系列第二章 Java语言基础 Java基础系列第三章 Java流程控制 Java基础系列第四章 Java数组与字符串 Java基础系列第五章 面向 ...

最新文章

  1. caddy 获取SSL证书报错解决:failed to obtain certificate: acme: Error - One or more domains had a problem
  2. AI算法不断突破 人工智能驱动创新需找对方向
  3. 先序,中序,后序线索二叉树
  4. dz论坛php.ini设置,Discuz!X1.5至3.2论坛Win主机与Linux主机伪静态设置方法
  5. 同事操作两个数据源保持事务一致_终于有人把分布式事务说清楚了
  6. Java屏蔽输入法_技巧:如何禁止输入法切换到全角状态
  7. 计算机辅助翻译入门试题,2011级计算机辅助翻译考试试题纸(A卷)
  8. python从1到n整数中1点的个数_Python解决 从1到n整数中1出现的次数
  9. A Game of Thrones(109)
  10. 分享一个手写轮播图的学习案例
  11. java面试说话技巧,Java面试题及解答技巧解析介绍
  12. 【知识点和练习题】心田花开:二年级语文汉语拼音补习
  13. C++设计模式23——访问者模式
  14. Bitly:构建月处理60亿点击的分布式系统
  15. 学习正则表达式 - 18位身份证号
  16. 使用Python异序词检测示例_清点法_排序法_蛮力法_计数法
  17. JRtplib开发笔记(二):JRtplib库编译、示例演示
  18. linux查询当前时间
  19. VBA 开发学习--基础语法
  20. Android——bug:not attached to a context.

热门文章

  1. Hyperledger Fabric 交易背书报错 no peer combination can satisfy the endorsement policy
  2. 《图解HTTP》全书内容表述
  3. 什么影响了他们 十大CEO创业的经典故事
  4. RapidScada 应用---安卓手机端监控插件KpAndroid
  5. PTA 人民币美元双向兑换 python
  6. 基于区域注意的通用目标检测
  7. JAVA阅读书籍推荐
  8. 学习笔记 | 条件概率、联合概率、全概率公式、贝叶斯公式
  9. 短视频与文字自媒体之争
  10. 【配置rust环境】windows+vscode