Java 封装的详解
我们日常使用的电脑主机,把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 封装的详解相关推荐
- java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)
Java基本数据类型与封装类型详解(int和Integer区别) 发布于 2020-4-19| 复制链接 摘记: int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Int ...
- java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)
int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...
- java基础(十三)-----详解内部类——Java高级开发必须懂的
java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...
- Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...
Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...
- 4.6 W 字总结!Java 11—Java 17特性详解
作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...
- MP实战系列(十一)之封装方法详解(续一)
之前写的封装方法详解,比较简要. 今天我主要讲增加和删除及其修改.查的话得单独再详讲. 增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个. 一.增加方法讲解 MyBatis Pl ...
- Java 序列化Serializable详解(附详细例子)
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...
- java多线程学习-java.util.concurrent详解
http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...
- Java 线程池详解及实例代码
转载自 Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...
最新文章
- 读《Linux内核设计与实现》我想到了这些书
- html5如何让保存的信息立即显示出来,如何用HTML5存储用户输入的信息
- sql limit 子句_Java 8流中的常见SQL子句及其等效项
- daily scrum 11.27
- 求小球落地5次后所经历的路程和第5次反弹的高度
- 1、selenium下载安装教程及环境变量配置
- 现代交换技术的基本概念及基本知识
- 谷歌地图高清卫星地图
- 校招面试问到Linux CPU不用怕,来看看这份宝典
- P5692 手牵手走向明天
- chrom浏览器模拟手机访问
- Mybatis学习笔记_5、Mybatis动态SQL
- CPLD和FPGA的区别
- SQL Server 2008 简体中文正式版下载地址(附序列号)
- 计算机模拟技术 意义,喷丸数值模拟技术的研究意义和发展
- 简要介绍COBIT 5
- java记忆纸牌 计分功能,实例:利用记忆宫殿 记忆扑克牌
- 专利检索大法,倾囊相受!
- 生物信息学数据库大全
- 搭建LNMP,可以解析PHP文件