千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:太原千锋IT培训  >  技术干货  >  从零开始学Java之面向对象三大特征之封装

从零开始学Java之面向对象三大特征之封装

来源:千锋教育
发布人:qyf
时间: 2023-03-23 17:50:46

  我们知道,面向对象是一种以对象为核心的软件开发思想。在这种编程思想中,有着明显的几个特征,通常我们归纳为如下三个:

  ● 封装(Encapsulation):将类或接口的实现细节部分包装、隐藏起来。

  ● 继承(extends):子类继承父类的特征和行为,使得子类对象(实例)拥有父类的实例域和方法;或子类从父类继承方法,使得子类拥有父类相同的行为。

  ● 多态(polymorphism):同一个行为具有多个不同表现形式或形态的能力,即同一个接口可以使用不同的实例执行不同的操作。

  但也有的面试官会问我们面向对象有哪四大特征?这就让你很懵逼,不都是三大特征吗?如果非要有这种傻缺的问法,那我们就可以再多回答一个”抽象”的概念即可。

  关于继承、多态和抽象等的概念,壹哥会在后面的文章中单独讲解,本篇文章先只讲封装是怎么回事。

  二. 封装

  所谓的封装,其实就是尽可能地隐藏对象的内部实现细节,控制对象的修改及访问权限,将某些实现细节部分包装、隐藏起来,并对外提供公开的方法访问私有成员。一般我们是利用private访问修饰符来实现。

  通俗地说,封装就是把一个Java类的部分实现进行“隐藏”、“包裹”,不让你完全看见它的“内部”是咋回事。就好比一个银行,有的地方(大厅)可以对外暴露,但有的地方(金库)就需要隐藏。我们在修建银行的时候,金库在设计之初就是要被隐藏的,但金库会预留一个渠道对外联通,让钱可以进出。

  Java里的封装其实也是这样的。把一个类中不想让别人直接看到的内容封装隐藏起来,不让别人直接操作这部分内容,但又可以通过某种方法对外展示。这样,我们对java类的操作就可进可退,保证了类的安全性。

  所以封装可以被认为是一种类的保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。如果想要访问该类的代码和数据,必须通过严格的接口控制。通过适当的封装,让程式码更容易理解与维护,也加强了代码的安全性。

  必要性

  那么Java里的类一定都要封装吗?我们来看一个场景,如下图所示:

  比如上面的Student类,内部有4个非私有的属性。我们可以在对象的外部,为这几个属性直接赋值。在上面的代码中,我们给age赋值20000,学生的年龄是20000,这合理吗?得分是1000合理吗?这就出现了非法的数据录入,存在数据的安全问题。这种问题该怎么解决?如何对属性的赋值加以控制?

  针对这种情况,我们就可以使用封装!将类内部的属性进行私有化,然后再提供对外的方法调用这些属性,并在方法内部对属性的赋值进行合理控制。别的地方只能通过规定的方法来访问数据,隐藏了类的实现细节,方便修改和实现,这样我们就不担心非法数据的录入问题了!这也就是封装的意义所在!

  既然封装有其存在的必要性,那么我们该如何实现封装呢?请继续往下看!

  3. 实现要求

  如果我们想实现类的封装,主要有以下两个步骤:

  给成员变量添加private修饰符;

  添加公开的get和set方法;

  在赋值和取值方法中,加入属性控制语句,对属性值的合法性进行判断。

  3.1 private关键词

  private是一种访问权限修饰符,是一个表示“私有的“关键词,可以修饰类、方法和变量等。如果用来修饰成员变量,可以实现成员变量的私有化,限制该成员变量只能在类的内部直接访问,类外不能直接访问。

  3.2 getter和setter方法

  通常情况下,这些get和set方法被称为getter和setter方法。任何访问类中私有成员变量的操作都要通过这些getter和setter方法。

  get方法是用来获取私有属性的方法,其语法结构为:

  public 返回值类型 getXxx(){

  return 返回属性值;

  }

  set方法是用来修改私有属性值的方法,其语法结构为:

  public void setXxx(属性类型 属性){

  this.xxx = 属性;

  //其他对属性进行操作的代码

  }

  这里我们要注意,get方法一般没有参数,但有返回值;set方法一般没有返回值,但有参数!!!

  4. 封装案例

  为了让大家更好地理解如何实现封装,壹哥设计一个Person类,我们来看看代码:

  /**

  * @author 一一哥Sun

  * QQ:2312119590

  * CSDN、掘金、知乎找我哦

  * 属性:姓名、年龄、性别

  * 封装步骤:(1).把成员变量变成私有的;(2).添加公开的get和set方法

  */

  public class Person {

  // 私有化属性

  private String name;

  private int age;

  private String sex;

  //设置公开方法

  // 获取name

  public String getName() {

  return name;

  }

  // 对name赋值

  public void setName(String name) {

  //this关键字解决了实例变量(private String name)和局部变量(String name)之间的同名冲突。

  this.name = name;

  }

  public int getAge() {

  return this.age;

  }

  public void setAge(int age) {

  // 限制年龄的范围

  if (age > 100 || age < 1) {

  // 设置一个默认值

  this.age = 18;

  } else {

  this.age = age;

  }

  }

  public String getSex() {

  return this.sex;

  }

  public void setSex(String sex) {

  // 设置性别

  if ("男".equals(sex) || "女".equals(sex)) {

  this.sex = sex;

  } else {

  this.sex = "男";

  }

  }

  //提供无参和有参的构造方法

  public Person() {

  super();

  }

  public Person(String name, int age, String sex) {

  super();

  this.name = name;

  this.age = age;

  this.sex = sex;

  }

  }

  从上述代码中,我们可以看出实现类的封装其实也很简单:

  成员变量(属性)私有化(用private修饰);

  添加公开的get和set方法,用public修饰;

  添加有参和无参的若干构造方法。

  一般我们把这样封装好的一个类成为Java Bean,Java Bean一般有两种:

  负责数据承载的Bean;

  负责业务逻辑的Bean。

  我们上面的案例,就是一个数据承载的Bean。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

React的遮羞布

2023-01-31

Local Storage的高阶用法

2023-01-31

javascript中如何将伪数组转换成真数组

2023-01-30

最新文章NEW

变量的预解析

2023-01-31

Vue中常见的组件间通信方案及典型应用场景

2023-01-31

VueJS中的动画菜单效果的实现

2023-01-31

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>