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面向对象编程为什么需要封装相关推荐

  1. java封装例题_java面向对象编程类的封装接口和基本类库练习题

    面向对象编程基本知识练习 一.判断题 1.不需要定义类,就能创建对象.() 2.构造方法用于给类的 private 实例变量赋值.() 3.对象一经声明就可以立即使用.() 4.在定义变量和方法时,必 ...

  2. java汽车油耗计算_JAVA面向对象编程-试卷B

    JAVA面向对象编程-试卷B 所属分类:其他 开发工具:Java 文件大小:15KB 下载次数:1 上传日期:2017-11-10 20:39:45 上 传 者:弑神唐三 说明:  定义一个交通工具类 ...

  3. java异常对象引用变量_Java面向对象编程-异常处理

    第九章 异常处理 异常情况会改变正常的流程,导致恶劣的后果,为了减少损失,应该事先充分预料所有可能出现的异常,然后采取以下措施: 首先考虑避免异常,彻底杜绝异常的发生:如果不能完全避免,则尽可能地减少 ...

  4. java类声明语句_Java面向对象编程-类的声明周期

    第十章 类的生命周期 10.1 Java虚拟机及程序的生命周期 当通过java命令运行一个Java程序时,就启动了一个Java虚拟机进程.Java虚拟机进程从启动到终止的过程,称为Java虚拟机的生命 ...

  5. 笔记本电脑java版下载教程_Java面向对象编程笔记本 PDF 下载

    主要内容: Ⅰ.语法基础 //导入 java.util 包下的 bai Scanner 类,导入后才能使用它.(放在 public class 之前) //Scanner 类的对象的定义形式 //从键 ...

  6. java泡泡堂教程_JAVA面向对象编程课程设计——泡泡堂(个人博客)

    二.个人负责模块或任务说明 GUI设计 游戏界面类.地图类的实现(实现与Player类的交互) 阿里巴巴扫描纠错 团队博客编写 三.自己的代码提交记录 四.自己负责模块或任务详细说明 1.地图Fiel ...

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

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

  8. Java基础【之】面向对象编程(封装、继承(extends、方法重写、super)、多态(动态绑定、重载/重写)、代码实现)

    Java基础[之]面向对象编程(封装.继承.多态.代码实现) 1.封装 2.继承 2.1.extends 2.2.方法重写 2.3.super 3.多态 3.1.对象的多态.方法的多态 3.2.动态绑 ...

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

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

最新文章

  1. 简书php硬件交互,php设计模式——适配器模式
  2. Agile DSL Development in Ruby 笔记
  3. linux-DNS(bind)-setting
  4. 不连续子网掩码的魅力
  5. c语言程序设计开卷考试b卷,C语言程序设计(B)试卷_杨崇联(A1).doc
  6. Python 一次for遍历多个列表及遍历时获取index
  7. 敏捷开发生态系统系列之五:关于敏捷生态系统的一次聊天记录(敏捷估算,同行压力,估算扑克)...
  8. 为operamasks增加HTML扩展方式的组件调用
  9. 漫画:如何实现大整数相乘?(下)
  10. 使用java向ftp上传多张图片_ftp免费空间,利用ftp工具定时连接ftp免费空间教程及java配置...
  11. 2.privite私有变量的意义
  12. 【转载】Nginx简介及使用Nginx实现负载均衡的原理
  13. linux mint 1.9 qq 安装
  14. 我们自研的那些Devops工具
  15. Unity AudioMixer效果器设置
  16. java抽象类的属性_JAVA 抽象类
  17. numpy一行转为一列
  18. yolov5 代码内容解析
  19. CSP CCF: 201909-3 字符画) (C++)
  20. Tomcat部署步骤

热门文章

  1. Docker学习总结(26)——Docker 管理工具的选择:Kubernetes 还是 Swarm?
  2. Nginx学习总结(7)——Nginx配置HTTPS 服务器
  3. pinpoint如何检测mysql_微服务链路监控系统-Pinpoint
  4. ffmpeg mp4 html5,FFMPEG mkv to mp4 conversion lacks audio in HTML5 player
  5. 解决设备行业尾款回收问题-深思精锐5时钟锁
  6. 通过样式调整input 中password text默认长度
  7. 悲哀!面试现场,简单几道java算法题,90%程序员没写出来
  8. [转] Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7
  9. JAVA 设计模式 职责链模式
  10. dex、apk完整性校验