java为什么使用封装_Java面向对象编程为什么需要封装
1.概述
学习了前面的面向对象的基础概念后,我们了解要以面向对象的思维来思考一个事物。面向对象有三个基本属性:封装、继承、多态。今天我们就重点讲解其中一个封装的概念。
抛开”封装“这个名词,我们一步一步来思考下面的问题:
2. 问题
我们定义一个学生类,它有姓名、年龄属性,
class Student{
String name;
int age;
}
为了看到这两个属性的值。我们再定义一个方法,把这两个属性显示出来。
public void show(){
System.out.println("姓名"+name);
System.out.println("年龄"+age);
}
我们再定义一个测试类StudentDemo,创建一个学生对象来调用上面的show方法,发现我们也可以对这个学生对象的属性进行赋值和修改。
public class StudentDemo {
public static void main(String[] args) {
// 创建学生对象
Student s = new Student();
s.show();
System.out.println("---------");
// 给成员变量赋值
s.name = "小雨";
s.age = 27;
s.show();
System.out.println("---------");
// 给年龄赋值
s.age = -27; // 这个数据时不合理的
s.show();
System.out.println("--------");
}
}
我们发现,通过对象给成员变量直接赋值,居然可赋一些非法的值,比如给年龄设置一个负数,显然这是不合理的。
我们想应该是这样子比较好,在赋值之前,先定义一个校验函数,对数据进行判断。
那么这个校验函数到底在哪里写做比较合适呢?
StudentDemo类是一个测试类,测试类一般只创建对象,调用方法。它只负责测试和调用,属性的判断应该放进原始的Student类中比较好,所以这个判断应该定义在Student类中。而我们在成员变量的位置可不可以进行数据判断呢?
显然是不可以的,因为做数据校验,必须要依靠一些逻辑语句。逻辑语句是应该定义在方法中的,所以,我们最终决定在Student类中写一个方法进行校验。
// 写一个方法对数据进行校验
/*
返回这类型:void
参数列表:int a
*/
public void setAge(int a){
if (a<0 || age>120){ // 一个人的年龄应该在0~120之间
System.out.println("你给的年龄有问题");
}else{
age = a;
}
}
按照上面我们的分析,我们给出这个方法进行校验输入的值。但是呢?此时,系统仍然可以通过对象来修改属性。还是可以直接赋值。这样我们定义的校验方法就起不到作用,我们应该要求你必须使用我的校验方法,而不能直接调用成员变量进行赋值。
怎样才能强制要求不能直接使用成员变量呢?
针对这种情况,Java就提供了一个用来修饰成员变量和成员方法的关键字private,表示私有的意思。
表示被private修饰的成员只能在本类中访问。
其实我们将到现在,讲的就是一个封装的思想,它表示隐藏对象的属性和实现细节,仅对外提供公共访问的方式。
最终版的代码如下:
class Student{
String name;
private int age;
// 写一个方法对数据进行校验
/*
返回这类型:void
参数列表:int a
*/
public void setAge(int a){
if (a<0 || age>120){
System.out.println("你给的年龄有问题");
}else{
age = a;
}
}
// show()方法,显示所有成员变量的值
public void show(){
System.out.println("姓名"+name);
System.out.println("年龄"+age);
}
}
public class App {
public static void main(String[] args) {
// 创建学生对象
Student s = new Student();
s.show();
System.out.println("---------");
// 给成员变量赋值
s.name = "swift";
// s.age = 27;
s.show();
System.out.println("---------");
// 给年龄赋值
// s.age = -27; // 这个数据时不合理的
s.setAge(-27);
s.show();
System.out.println("--------");
}
}
小结:
封装将不需要对外提供的内容都隐藏起来,把属性隐藏,提供公共方法对其访问。好处就是:隐藏实现细节,提供公共的访问方式;提高了代码的复用性;提高了安全性。
java为什么使用封装_Java面向对象编程为什么需要封装相关推荐
- java封装例题_java面向对象编程类的封装接口和基本类库练习题
面向对象编程基本知识练习 一.判断题 1.不需要定义类,就能创建对象.() 2.构造方法用于给类的 private 实例变量赋值.() 3.对象一经声明就可以立即使用.() 4.在定义变量和方法时,必 ...
- java汽车油耗计算_JAVA面向对象编程-试卷B
JAVA面向对象编程-试卷B 所属分类:其他 开发工具:Java 文件大小:15KB 下载次数:1 上传日期:2017-11-10 20:39:45 上 传 者:弑神唐三 说明: 定义一个交通工具类 ...
- java异常对象引用变量_Java面向对象编程-异常处理
第九章 异常处理 异常情况会改变正常的流程,导致恶劣的后果,为了减少损失,应该事先充分预料所有可能出现的异常,然后采取以下措施: 首先考虑避免异常,彻底杜绝异常的发生:如果不能完全避免,则尽可能地减少 ...
- java类声明语句_Java面向对象编程-类的声明周期
第十章 类的生命周期 10.1 Java虚拟机及程序的生命周期 当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程.Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命 ...
- 笔记本电脑java版下载教程_Java面向对象编程笔记本 PDF 下载
主要内容: Ⅰ.语法基础 //导入 java.util 包下的 bai Scanner 类,导入后才能使用它.(放在 public class 之前) //Scanner 类的对象的定义形式 //从键 ...
- java泡泡堂教程_JAVA面向对象编程课程设计——泡泡堂(个人博客)
二.个人负责模块或任务说明 GUI设计 游戏界面类.地图类的实现(实现与Player类的交互) 阿里巴巴扫描纠错 团队博客编写 三.自己的代码提交记录 四.自己负责模块或任务详细说明 1.地图Fiel ...
- Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态
Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...
- Java基础【之】面向对象编程(封装、继承(extends、方法重写、super)、多态(动态绑定、重载/重写)、代码实现)
Java基础[之]面向对象编程(封装.继承.多态.代码实现) 1.封装 2.继承 2.1.extends 2.2.方法重写 2.3.super 3.多态 3.1.对象的多态.方法的多态 3.2.动态绑 ...
- 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态
Java面向对象编程三大特征 - 多态 本文关键字:Java.面向对象.三大特征.多态 多态是面向对象编程的三大特征之一,是面向对象思想的终极体现之一.在理解多态之前需要先掌握继承.重写.父类引用指向 ...
最新文章
- 简书php硬件交互,php设计模式——适配器模式
- Agile DSL Development in Ruby 笔记
- linux-DNS(bind)-setting
- 不连续子网掩码的魅力
- c语言程序设计开卷考试b卷,C语言程序设计(B)试卷_杨崇联(A1).doc
- Python 一次for遍历多个列表及遍历时获取index
- 敏捷开发生态系统系列之五:关于敏捷生态系统的一次聊天记录(敏捷估算,同行压力,估算扑克)...
- 为operamasks增加HTML扩展方式的组件调用
- 漫画:如何实现大整数相乘?(下)
- 使用java向ftp上传多张图片_ftp免费空间,利用ftp工具定时连接ftp免费空间教程及java配置...
- 2.privite私有变量的意义
- 【转载】Nginx简介及使用Nginx实现负载均衡的原理
- linux mint 1.9 qq 安装
- 我们自研的那些Devops工具
- Unity AudioMixer效果器设置
- java抽象类的属性_JAVA 抽象类
- numpy一行转为一列
- yolov5 代码内容解析
- CSP CCF: 201909-3 字符画) (C++)
- Tomcat部署步骤
热门文章
- Docker学习总结(26)——Docker 管理工具的选择:Kubernetes 还是 Swarm?
- Nginx学习总结(7)——Nginx配置HTTPS 服务器
- pinpoint如何检测mysql_微服务链路监控系统-Pinpoint
- ffmpeg mp4 html5,FFMPEG mkv to mp4 conversion lacks audio in HTML5 player
- 解决设备行业尾款回收问题-深思精锐5时钟锁
- 通过样式调整input 中password text默认长度
- 悲哀!面试现场,简单几道java算法题,90%程序员没写出来
- [转] Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7
- JAVA 设计模式 职责链模式
- dex、apk完整性校验