封装概述:

封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

这是什么意思呢?

简单的来说就是我将不想给别人看的数据,以及别人无需知道的内部细节, “锁起来” ,我们只留下一些入口,使其与外部发生联系。

我们如何给我们的数据 “上锁” 呢?

我们使用,public、private、protected 等权限修饰符 在类的内部设定了边界,这些不同程度的 ”锁“ 决定了紧跟其后被定义的东西能够被谁使用。

封装的好处:

· 隐藏实现细节,提供公共的访问方式

· 提高了代码的复用性

· 提高安全性

封装好处的体现方式:

(一)隐藏实现细节,提供公共的访问方式

隐藏实现细节怎么理解呢?

我们将一些功能封装到类中,而客户端的程序员,不需要知道类中的这个方法的逻辑原理,类程序员只需要给他一个对外的接口,客户端程序员只需要能够调用这个方法即可,

例如:夏天宿舍很热,我们(用户)只需要操作遥控器即可使用空调,并不需要了解空调内部是如何运行的

提供公共的访问方式又怎么理解呢?

我们先来看一段标准案例

public class Student {
//定义成私有成员变量(private)
private String name;
private int age; //无参构造
public Student() {
super();
} //带参构造
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} //成员变量的set和get方法(与外界联系的桥梁)
public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setAge(int age) {
this.age = age;
} public int getAge() {
return age;
}
}
public class StudentDemo {
public static void main(String[] args) {
//创建学生类对象 s
Student s = new Student(); //对象s调用类中的公共方法setName()和setAge()
//set方法给成员变量赋值
s.setName("BWH_Steven");
s.setAge(20); //get方法获取成员变量
System.out.println(s.getName() + s.getAge());
}
}

我们可以看到在上面的案例中,成员变量都使用private修饰,而下面的get和set方法均使用了public修饰,其实被private修饰的属性就是我们想要锁起来的数据,而set、get方法就是我们打开这把锁的钥匙

被private所修饰的内容是,除类型创建者和类型的内部方法之外的任何人都不能访问的元素,所以我们这些数据就被我们通过private “锁” 了起来,而我们外界是可以通过创建对象来调用一个类中的公共方法的,所以被public修饰的 set和get方法外界所能访问的,而这两个方法又可以直接访问我们的私有成员变量,所以set和get方法就成为了私有成员与外界沟通的钥匙。

(二)提高了代码的复用性

功能被封装成了类,通过基类与派生类之间的一些机制(组合和继承),来提高代码的复用性

Ps:关于代码复用问题,我会专篇讲解,今天还是着重讲解封装带来的主要好处

(三)提高安全性

看完上面的代码,可能大家会有一点疑惑,这些属性、方法封装后我都还可以看得到,这哪里体现了安全呢?大家来一起看一看我们下面这个改进版的案例

public class Student {

    private String name;
private int age; public Student() {
super();
} public Student(String name, int age) {
super();
this.name = name;
this.age = age;
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} //在setAge()方法中加入了校验的内容
//不合法数据是不允许传递给成员变量的
public void setAge(int age) {
if (age < 0 || age > 120) {
System.out.println("Error");
}else {
this.age = age;
}
} public int getAge() {
return age;
}
}
public class StudentDemo {
public static void main(String[] args) {
Student s = new Student();
System.out.println(s.getName() + s.getAge()); //错误的方式!!!
s.name = "BWH_Steven";
s.age = 20;
System.out.println(s.getName() + s.getAge()); //正确的方式!!!
s.setName("BWH_Steven");
s.setAge(20);
}
}

我们用private来修饰我们的成员变量不是没有任何依据的,如果我们的成员变量修饰符改为public,这句意味着外界可以使用对象直接访问,修改这个成员变量,这可能会造成一些重大的问题

例如:外界通过对象去给成员变量赋值,可以赋值一些非法的数据

这明显是不合理的。所以在赋值之前应该先对数据进行判断

StudenDemo是一个测试类,测试类一般只创建对象,调用方法

所以这个判断应该定义在Student类中。需要使用逻辑语句

逻辑语句应该定义在方法中。所以在Student类中提供一个方法来对数据进行校验

但是如果偏偏不调用方法来赋值,还是直接赋值,这样我们的方法就没有起作用

所以我们必须强制要求使用我的方法,而不能直接调用成员变量

这也正是我们使用private修饰成员变量的原因!

结尾:

如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !_

如果能帮到你的话,那就来关注我吧!

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创Java技术的公众号:理想二旬不止

大白带你侃JAVA——封装的概述及好处的更多相关文章

  1. Notes 20180506 : Java程序设计语言概述

    2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...

  2. Java Reference简要概述

    @(Java)[Reference] Java Reference简要概述 Reference对象封装了其它对象的引用,可以和普通的对象一样操作. Java提供了四种不同类型的引用,引用级别从高到低分 ...

  3. 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)

    本文针对的问题是 ICTCLAS2015 的多线程分词,为了实现多线程做了简单的JAVA封装.如果有需要可以自行进一步封装其它接口. 首先ICTCLAS2015的传送门(http://ictclas. ...

  4. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  5. Java 封装 继承 多态

    Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法 ...

  6. Java:多线程概述与创建方式

    目录 Java:多线程概述与创建方式 进程和线程 并发与并行 多线程的优势 线程的创建和启动 继承Thread类 start()和run() 实现Runnable接口 实现Callable接口 创建方 ...

  7. java 封装与this关键字

    一 封装 1.封装的概述 封装,它也是面向对象思想的特征之一.面向对象共有三个特征:封装,继承,多态. 封装表现: 1.方法就是一个最基本封装体. 2.类其实也是一个封装体. 从以上两点得出结论,封装 ...

  8. java封装的方法

    java封装是由Java是面向对象程序设计语言的性质决定的,面向对象程序设计语言的三大特性之一就是封装.封装其实就是包装的意思,从专业的角度来看,就是把对象的所有组成部分组合在一起,保护私有属性. 如 ...

  9. (转)面试大总结之一:Java搞定面试中的链表题目

    面试大总结之一:Java搞定面试中的链表题目 分类: Algorithm Interview2013-11-16 05:53 11628人阅读 评论(40) 收藏 举报 链表是面试中常出现的一类题目, ...

随机推荐

  1. oracle数据库外连接

    外连接作用:(左外连接和右外连接;注:没有全外连接) 希望把某些不成立的记录(40号部门),仍然包含在最后的结果中 左外连接:当where e.deptno=d.deptno不成立的时候,等号左边的表 ...

  2. linux中fork--子进程是从哪里开始运行

    转自  http://blog.csdn.net/koches/article/details/7787468 fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值 ...

  3. 2019CCPC-江西省赛C题 HDU6569 GCD预处理+二分

    Trap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  4. docker pull 报错Get https://xxx.xxx.xxx.xxx:5000/v1/_ping: http: server gave HTTP response

    解决方法: vim /etc/docker/daemon.json { "insecure-registries":["xxx.xxx.xxx.xxx:5000" ...

  5. table表格整体居中

    代码: <div style="text-align:center"> <table border="1" cellpadding=" ...

  6. servlet 中session的使用方法(创建,使用)

    创建: protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, ...

  7. CF1197C

    CF1197C 题意: 有一个递增的数列,把它分成k段,找到这样的分段方法,即每段最大值减最小值的和最小 解法: 分成k段,即要加k-1个隔断,这k-1个隔断,能隔开差值最大的几个,那最后得到分隔后的 ...

  8. mysql测试记录

    一直觉得mysql的Memony内存引擎挺好,其他数据库都没有,正好有空,所以试试. 版本:mysql-installer-community-8.0.17.0 os:windows10 SSD硬盘, ...

  9. np.random.choices的使用

    在看莫烦python的RL源码时,他的DDPG记忆库Memory的实现是这样写的: class Memory(object): def __init__(self, capacity, dims): ...

  10. spaCy 第二篇:语言模型

    spaCy处理文本的过程是模块化的,当调用nlp处理文本时,spaCy首先将文本标记化以生成Doc对象,然后,依次在几个不同的组件中处理Doc,这也称为处理管道.语言模型默认的处理管道依次是:tagg ...