写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。

  • 对于文章中出现的任何错误请大家批评指出,一定及时修改。
  • 有任何想要讨论和学习的问题可联系我:zhuyc@vip.163.com。
  • 发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

Java面向对象编程三大特征 - 封装

本文关键字:Java、面向对象、三大特征、封装

文章目录

  • Java面向对象编程三大特征 - 封装
    • 一、名词解读
      • 1. 权限修饰符
      • 2. 权限对应关系表
      • 3. 属性访问
    • 二、概念阐释
      • 1. 封装有什么用
      • 2. 如何进行封装
      • 3. 常规封装方法

封装是面向对象编程中的三大特征之一,在对封装性进行解释时我们有必要先了解一些面向对象的思想,以及相关的概念。当我们想要去描述一系列的关系时我们要用到的最基本结构就是类,其中存在着成员变量和方法,用于记录属性和表达行为,相关知识请进传送门: Java中的基本操作单元 - 类和对象。

一、名词解读

为了解释封装的概念和作用,需要先来了解一下几个相关的概念,这有助于我们接下来的理解。

1. 权限修饰符

当我们在一个类中定义成员变量时,会指定一个变量的类型,除此之外,还会有修饰符的部分,在此给出定义成员变量的规范格式:

// 定义变量
[修饰符] 变量类型 变量名称;
[修饰符] 变量类型 变量名称 = 初始值;

修饰符起到的作用从字面就可以解释,起到一个修饰和限定的作用,可以使用在成员变量之前的修饰符可以是:publicprotectedprivate、final、static。
修饰符与修饰符之间的顺序没有强制要求,其中public、protected、private被称为权限修饰符,可以用来限定类的属性和方法的访问权限,指明在哪些包的哪些类中能够调用到这些属性或方法,是一种一定会存在的修饰符。需要注意的是,这三个单词不能同时出现,当这三个单词都不出现的时候会被认为是默认访问权限,所以权限修饰符一共有四种:private、默认、protected、public。

2. 权限对应关系表

  • private:私有权限,只能在定义的类中访问,在其他类中创建的实例均无法访问
  • 默认:同包可访问权限,在没有声明权限修饰符时为默认权限,允许在同包的其他类访问
  • protected:受保护权限,允许有继承关系的子类访问
  • public:公共权限,允许任何类访问

3. 属性访问

由于权限修饰符在封装特性中的作用只是实现封装性的一种途径,所以在这里只演示private与public的作用,权限修饰符的其他作用将在后续的文章中继续介绍。

src
└──edu└──sandtower└──bean│    Person.java└──test│    Test.java

以上为实体类与测试类所在的目录结构,Person实体类所在包:edu.sandtower.bean,Test测试类所在包:edu.sandtower.test,相应代码如下:

package edu.sandtower.bean;public class Person{// 声明公开属性public String name;// 声明私有属性private double money;
}
package edu.sandtower.test;import edu.sandtower.bean.Person;public class Test{public static void main(String[] args){// 在test包中的Test类中创建Person实例Person person = new Person();person.name = "小张";// 编译通过,可以访问name属性person.money = 500.0;// 编译失败,无法访问money属性}
}

从上面的例子可以看出,虽然依然是使用Person自己的实例在进行属性的调用,但是我们是在另外一个包中的类发生的调用,所以是不能够访问到private修饰的属性的,在刚开始学习时一定要注意区分。

二、概念阐释

1. 封装有什么用

通过使用权限修饰符,我们可以限定类的成员的被访问权限,那为什么要这样做呢?在很多场景下,我们需要确保我们对属性值的操作均是有效操作,不能违背某些规则。
比如,我们定义了一个Person类,具有name和money两个属性,在买东西时需要扣掉相应的金额,原始写法如下:

public class Person{public String name;public double money;
}
public class Test{public static void main(String[] args){Person person = new Person();person.money = 500;// 初始金额500元System.out.println("购买一张桌子,花费200元");person.money -= 200;System.out.println("购买二手PSP,花费350元");person.money -= 350;System.out.println("目前余额为:" + person.money);// -50}
}

可以看到,经过代码操作以后可能会导致money的属性为负。看官甲:你自己不加判断赖代码?没错,这个问题我们可以增加判断代码来解决,由于这个操作是对money属性值的操作,我们将它封装成一个方法写在实体类中,于是有了改进之后的代码:

public class Person{public String name;public double money;// 定义一个方法,用于设置money属性的值public void setMoney(double money){if(money >= 0){this.money = money;}}
}
public class Test{public static void main(String[] args){Person person = new Person();person.money = 500;// 初始金额500元System.out.println("购买一张桌子,花费200元");person.setMoney(person.money - 200);System.out.println("购买二手PSP,花费350元");person.setMoney(person.money - 350);System.out.println("目前余额为:" + person.money);// 300}
}

经过上面的改进,我们可以确保money的值不为负数,同时可以看到,当在实体类中定义方法后,使用者需要修改属性值时直接调用方法就可以保证不出问题。但是由于属性值依然可以被直接访问,还不能保证万无一失,于是我们利用权限修饰符使得变量不能被直接访问,同时需要定义一个能够取得属性值的方法。

public class Person{public String name;// 声明money属性为private权限private double money;// 定义一个方法,用于设置money属性的值public void setMoney(double money){if(money >= 0){this.money = money;}}// 定义一个方法,用于获取money属性的值public double getMoney(){return this.money;}
}
public class Test{public static void main(String[] args){Person person = new Person();person.setMoney(500);// 初始金额500元,此时已经不能使用对象.属性的方法赋值System.out.println("购买一张桌子,花费200元");person.setMoney(person.getMoney() - 200);System.out.println("购买二手PSP,花费350元");person.setMoney(person.getMoney() - 350);System.out.println("目前余额为:" + person.getMoney());// 300}
}

通过以上的案例,我们可以看到进行封装有以下几个作用:

  • 防止类的属性被外部代码随意的修改和访问,保证数据的完备性
  • 将对属性的操作转换为方法,更加灵活和安全
  • 使用封装可以隐藏实现的细节:使用者只需要关心作用,不需要知道过程
  • 在类的定义结构中修改,提高了代码的可维护性,同时又可以不影响外部的使用
  • 通过封装方法可以有效减少耦合
    • 耦合:模块与模块之间,代码与代码之间的关联程度,对属性封装后,和调用相关的代码就会变得相对简单,可以降低耦合

2. 如何进行封装

在进行封装时都是出于对属性保护的考虑,可以按照以下两个步骤来进行:

  • 使用权限修饰符

    • 使用private作用在属性上,关闭直接访问的入口
    • 使用public作用在方法上,提供调用的入口
  • 定义与属性存取相关的方法

在属性关闭后,我们需要通过方法来获取属性的值以及对属性值进行修改。由于有了方法结构,我们就可以对存入的数据进行判断,对不符合逻辑的数据进行处理。

3. 常规封装方法

明白了封装的作用后,我们可以通过自定义方法的方式完成对属性的封装。封装方法和类中定义的其他方法在结构上没有任何的区别,同样都是普通的方法,区别主要在于体现在用途方面:

  • 普通方法主要表达该类所能产生的行为
  • 封装方法主要为属性的访问和使用提供了一个入口,作用相对单一

在进入到框架的学习之后,很多对实体类属性自动赋值的操作都是通过调用封装方法实现的,所以我们必须要知道常规封装方法的名称定义和类型设置规则。
对于属性来说我们只会进行两种操作:存和取。那么相应的封装方法应该有一对儿

  • get代表取用:既然是取值,那么就要把属性值进行返回,方法的返回值类型与属性类型相同
  • set代表存储:既然是存值,那么就要在参数列表中接收想要存入的值,类型与属性类型相同

对于命名方面只要遵从驼峰命名法就好,以get或set开头,大写属性名称的首字母,其余不变,看下面一个例子:

public class Person{// 使用private声明属性private String name;private double money;// 使用public声明方法,作为操作属性的入口public void setName(String name){this.name = name;}public String getName(){return this.name;}public void setMoney(double money){// 如有需要,可以在方法中可以自定义其他逻辑this.money = money;}public double getMoney(){return this.money;}
}

由于常规封装方法定义的格式和名称都相对固定,所以一般的编译器都自带自动生成封装方法的功能,这样既方便又能降低出错率,大家一定要掌握。

  • Eclipse:

属性定义完成后,选择source菜单 -> Generate Getters and Setters…

点击Select All(选择所有属性) -> Generate

  • IDEA:

与Eclipse类似,在定义好类的私有属性后,使用快捷键:Alt + Insert

可以一次性选择多个属性 -> 点击OK

扫描下方二维码,加入官方粉丝微信群,可以与我直接交流,还有更多福利哦~

Java面向对象编程三大特征 - 封装相关推荐

  1. Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态

    Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...

  2. 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态

    Java面向对象编程三大特征 - 多态 本文关键字:Java.面向对象.三大特征.多态 多态是面向对象编程的三大特征之一,是面向对象思想的终极体现之一.在理解多态之前需要先掌握继承.重写.父类引用指向 ...

  3. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  4. JS面向对象编程三大特征

    JS面向对象编程三大特征 JS面向对象的三大特征为封装.继承.多态.下面分别进行介绍: 封装 封装是指创建一个对象集中保存一个事物的属性与功能 继承 继承是指父亲的成员,孩子无需重复创建就可直接使用. ...

  5. 对java面向对象的三大特征的理解_Java面向对象的三大特征是什么?

    面向对象的三大核心特性简介 面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率. 该开发模式之所以使程序设计更加完善和强大,主要是因为面向对象具有 ...

  6. Java面向对象的三大特征(封装,继承,多态)

    一.封装 1.概念    封装是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的. 2.封装原则   将类的某些信息隐藏在类内部,不允许外部程序直接访问, ...

  7. Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]

    ✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...

  8. Java面向对象的三大特征:封装、继承和多态

    封装: 封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法),才能对数据进行操作. 封装--访问控制修饰符(Java提供四种访问控制修饰符) ...

  9. java面向对象的三大特征是6_Java面向对象的三大特征

    面向对象的本质:以类的方式组织代码,以对象的方式组织数据. 面向对象三大特性:封装 继承 多态 封装: 概念: 隐藏对象内部的复杂性,只对外公开简单的接口.便于外界调用,从而提高系统的可扩展性,可维护 ...

  10. 面向对象编程三大特征之一 继承

    文章目录 继承 概述 语句定义格式 继承的特点 注意事项 继承与成员变量之间的关系 this关键字与super关键字的使用区别 继承与构造方法的关系 继承与成员方法的关系 重写与重载的区别 方法重写的 ...

最新文章

  1. python 生命之花_python股票用什么电脑配置:贵州合力股票价格多少钱_XAC配资之家...
  2. php语句拼装,Thinkphp语句拼接
  3. 机器学习(part1)--机器学习第一课
  4. java double用法_Java Double doubleToLongBits()用法及代码示例
  5. 缓冲池java_了解Java缓冲池
  6. CAN笔记(21) 服务数据对象
  7. 《深入理解 Spring Cloud 与微服务构建》第六章 服务注册和发现 Eureka
  8. Hadoop3集群搭建之——hive添加自定义函数UDTF (一行输入,多行输出)
  9. sap 标准委外和工序委外_SAP那些事-实战篇-74-公司间委外的几种方式探讨
  10. mysql引擎机制_MySQL引擎特性:InnoDB同步机制
  11. [ Typescript 手册] JavaScript `Date` 在 Typescript 中的接口
  12. python workflow_用 Python 写 Alfred3 workflow 插件,一个最小示例
  13. 多目标优化算法(一)NSGA-Ⅱ(NSGA2)
  14. c语言挖地雷游戏,c扫雷小游戏
  15. 投影仪全国产化电子元件推荐方案
  16. 拍照解数独之识别数独图片
  17. VMware Workstation 15 Player 社区版安装教程
  18. cpu的基本结构及其工作原理
  19. oracle 汉字显示问号
  20. linux 静态编译多媒体框架,Go编译32位GNU静态链接库的方法

热门文章

  1. 2022年谷歌Chrome等浏览器在线打开编辑保存微软Office/金山WPS的Word、Excel和PPT技术方案大全
  2. Python:处理车辆控制单元MDF(CANApe数据)记录文件思路
  3. 前端系列教程之JS(自认为有用代码)
  4. 超市管理系统java代码_java实现简单超市管理系统
  5. 简单易用的标签列表界面(宝宝用了都不哭了 )
  6. 网站COM组件调用失败解决办法
  7. 网易云接口获取音乐(转载练习)
  8. html js打开一个新页面跳转,js页面跳转
  9. 机器学习——神经网络
  10. php 省份的缩写,34个省级行政区记忆口诀、省份简称和省会城市表