我们日常使用的电脑主机,把cpu、内存、主板等等都封装到机箱里面去。假如没有机箱的话的出现什么问题,主机、主板全部都散落在一处,然后开机没有开机按钮,那么需要我们直接操作接跳线才能把电脑开启。这样子的话假如操作不慎的话,会让机器损坏危险,那么假如用机箱封装起来的话,那么就不需要这样子做了。体现了封装的---安全特性。

你拿电脑去加内存,可以直接给电脑给维修的人,等他加好内存了之后。你拿到的还是那个机箱,里面发生了怎样子的变化你并不知道。封装的第二个好处-将变化隔离。

在机箱里面提供一个开机按钮,而不需要你直接使用跳线开机的话,体现了封装的—便于使用的特性。

只要机箱提供了一个开机的功能,然后无论这个机箱拿到哪里去,都可以使用这个开机的功能.体现了封装的---提供重复性的特性。

对比一下没有封装和有封装~

一,没有封装的时候:

模拟问题

1. 描述Employee类。定义姓名,工号,性别的成员变量,和工作的方法。成员使用public修饰。

2. 创建Employee对象,对象.成员的方式进行赋值。最后该对象调用工作方法。

3. 总结:如果不使用封装,很容易赋值错误,并且任何人都可以更改,造成信息的    不安全。

4. 问题解决:使用封装

public class EmployeeDemo {public static void main(String[] args) {// 创建对象Employee jack = new Employee();// 进制通过类名.成员的形式调用成员。初始化实例变量jack.name = "jack";jack.id = "123456";jack.gender = "男";// 调用成员方法jack.work();System.out.println();// 传入非法的参数jack.gender = "不是男人";jack.work();}
}class Employee {String name;String id;String gender;public void work() {System.out.println(id + ":" + name + ":" + gender + " 努力工作中!!!");}
}

二,有封装的时候:

1:设置类的属性为private(关键字),不能使用对象名.属性名的方式直接访问对象的属性。

public class EmployeeDemo {public static void main(String[] args) {// 创建对象Employee jack = new Employee();//编译报错jack.name = "jack";jack.id = "123456";jack.gender = "男";// 编译报错jack.gender = "不是男人";jack.work();}
}class Employee {//使用了private修饰了成员变量private String name;private String id;private String gender;public void work() {System.out.println(id + ":" + name + ":" + gender + " 努力工作中!!!");}
}

2:修改Employee类 性别的修饰符修改为private

1:编译不通过

2:private修饰的成员在自己所在的类中可以使用,在类外边不可以使用。

3:Employee类的gender的修饰符修改为private后,无法再类外调用,那么如何给gender设置值?

1:对外提供公开的用于设置对象属性的public方法

1:设置set

2:获取get

2:在set方法中加入逻辑判断,过滤掉非法数据。

3:将所有的成员变量封装加上private,提供get、set方法

public class EmployeeDemo {public static void main(String[] args) {// 创建对象Employee jack = new Employee();// 调用公有方法,给成员变量赋值。jack.setId("007");jack.setName("jack");jack.setGender("男xx");// 获取实例变量的值System.out.println(jack.getGender());System.out.println(jack.getId());System.out.println(jack.getName());// 调用成员方法jack.work();}
}class Employee {private String name;private String id;private String gender;// 提供公有的get set方法public String getName() {return name;}public void setName(String n) {name = n;}public String getId() {return id;}public void setId(String i) {id = i;}public String getGender() {return gender;}public void setGender(String gen) {if ("男".equals(gen) || "女".equals(gen)) {gender = gen;} else {System.out.println("请输入\"男\"或者\"女\"");}}public void work() {System.out.println(id + ":" + name + ":" + gender + " 努力工作中!!!");}
}

三,封装的好处:

1:隐藏了类的具体实现

2:操作简单

3:提高对象数据的安全性

写一个例子吧~

描述一个计算器类

class Calculator
{// 1. 查看具体的计算器对象抽取所有计算器具有的共同属性public String name = "我的计算器我做主";public double num1;public double num2;public char option;// 2. 查看具体的计算器对象抽取所有计算器具有的共同功能// 2.1  定义接受数据的功能函数public void init( double a , char op , double b  ){num1 = a;option  = op;num2 = b;}// 2.2 定义计算的功能public void calculate(){switch ( option ){case '+': System.out.println(  name + " : " + num1 + " + " + num2 + " = " + ( num1 + num2 ) );break;case '-': System.out.println(  name + " : " + num1 + " - " + num2 + " = " + ( num1 - num2 ) );break;case '*': System.out.println(  name + " : " + num1 + " * " + num2 + " = " + ( num1 * num2 ) );break;case '/': {if( num2 != 0 ) System.out.println(  name + " : " + num1 + " / " + num2 + " = " + ( num1 / num2 ) );elseSystem.out.println("除数不能为0!");break;}case '%': {// 1.处理结果的符号问题,使得结果的符号满足数学的要求// 2.解决NaN的问题System.out.println(  name + " : " + num1 + " % " + num2 + " = " + ( num1 % num2 ) );break;}default : System.out.println("你在捣乱,我不理你,气死你......");}}
}
class Demo9
{public static void main(String[] args) {Calculator  cal = new Calculator();cal.init( 41 , '%' , 0 );cal.calculate();System.out.println("计算完毕!再来一次......");}
}

Java 封装的详解相关推荐

  1. java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)

    Java基本数据类型与封装类型详解(int和Integer区别) 发布于 2020-4-19| 复制链接 摘记: int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Int ...

  2. java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...

  3. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  4. Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...

    Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...

  5. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  6. MP实战系列(十一)之封装方法详解(续一)

    之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...

  7. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  8. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  9. Java 线程池详解及实例代码

    转载自  Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...

最新文章

  1. 读《Linux内核设计与实现》我想到了这些书
  2. html5如何让保存的信息立即显示出来,如何用HTML5存储用户输入的信息
  3. sql limit 子句_Java 8流中的常见SQL子句及其等效项
  4. daily scrum 11.27
  5. 求小球落地5次后所经历的路程和第5次反弹的高度
  6. 1、selenium下载安装教程及环境变量配置
  7. 现代交换技术的基本概念及基本知识
  8. 谷歌地图高清卫星地图
  9. 校招面试问到Linux CPU不用怕,来看看这份宝典
  10. P5692 手牵手走向明天
  11. chrom浏览器模拟手机访问
  12. Mybatis学习笔记_5、Mybatis动态SQL
  13. CPLD和FPGA的区别
  14. SQL Server 2008 简体中文正式版下载地址(附序列号)
  15. 计算机模拟技术 意义,喷丸数值模拟技术的研究意义和发展
  16. 简要介绍COBIT 5
  17. java记忆纸牌 计分功能,实例:利用记忆宫殿 记忆扑克牌
  18. 专利检索大法,倾囊相受!
  19. 生物信息学数据库大全
  20. 搭建LNMP,可以解析PHP文件

热门文章

  1. Azure blob 文件下载
  2. 关于++m 和 m++
  3. Java学习路线资源
  4. CSS控制文字的一些基本属性的使用
  5. 图片像素英寸厘米之间的单位换算
  6. S4HANA 如何初始化启用Fiori到安装 FIORI My Inbox App
  7. InstallShield打包软件使用
  8. 网瘾室友用一个月的时间,面试进入了网易,他是怎么做到的?
  9. Quaetur实验报告
  10. linux服务器上使用find查杀webshell木马方法