封装
版权声明
- 本文原创作者:清风不渡
- 博客地址:https://blog.csdn.net/WXKKang
一、引入
这一篇我们来学习面向对象的第一大特点——封装,那么,什么是封装呢?我们为什么要进行封装呢?带着这些问题,我们来通过一个通俗易懂的例子来初步理解一下封装
首先有一个问题,我们写代码的时候是在什么地方写呢?哈哈,当然是在电脑上写咯,那么电脑是有一种叫做台式机的,它有一个“大黑盒子”——机箱,它“封装”着电脑的cpu、内存、主板等硬件设备,假设没有机箱来封装它们的话,那么这些硬件设施全部散落在地上,需要闭合闸刀才能将电脑启动,如果操作不慎的话还会被损坏,而且不论是移动起来还是放置在那里都不安全,而将这些硬件设施“封装”在机箱内的话就可以避免这个问题,这体现了封装的第一个好处:安全特性
设想,如果机箱内的硬件坏了需要置换或是需要增加内存,我们可以直接将电脑给维修人员,等维修好了之后我们拿到的还是那个机箱,并不知道里面发生了什么变化,这就体现出了封装的第二个好处:将变化隔离
并且,如果将硬件以机箱的形式“封装”好的话,就不需要通过闭合闸刀来开启电脑了,直接按下开机键就可以了,这就体现出了封装的第三个好处:易于使用
这个机箱具有“开机”功能,然后无论我们将这个机箱拿到哪里去,我们都可以通过它来使用这个功能,这就体现出了封装的第四个好处:可重用
二、封装
1、比较封装的好处
这是一个没有通过封装的学生类:
public class Student {
public String id;
public String name;
public String gender;
public void message() {
System.out.println("此学生的个人信息:id="+id+",name="+name+",gender="+gender);
}
}
测试类:
package com.etime01;
public class Demo {
public static void main(String[] args) {
//创建对象
Student student = new Student();
//直接通过类名.属性名来为属性赋值
student.id="S102";
student.name = "小明";
student.gender = "男";
//调用成员方法
student.message();
//传入非法参数
student.gender = "无";
student.message();
}
}
运行结果:
通过上面的例子我们可以看到,因为没有封装,所以我们可以直接通过类名.属性名的方式给学生赋值,而且只要是符合该属性的数据类型,都会被赋值,这样就出现了一个问题——非法数据也可以赋值给属性,那么怎么解决这个问题呢?就要通过封装了
2、封装的实现
(1)设置属性的可见性
什么是可见性呢?Java中的可见性并不是我们生活中的“看得见”与“看不见”,而是可不可以访问的到,用来设置可见性的关键字有四个,它们的作用是:对类的成员变量和成员方法通过设置一定的访问可见性来限定应用范围,这四个关键字如下:
先来我们就通过上一个例子来实现封装的第一步——设置属性的可见性吧 ~ ~ 代码如下:
public class Student {
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
private String id;
private String name;
private String gender;
public void message() {
System.out.println("此学生的个人信息:id="+id+",name="+name+",gender="+gender);
}
}
(2)为所有属性提供get,set方法
当我们给id,name,gender三个属性设置可见性为私有的之后,就不可以通过类名.属性名来直接给类中的属性赋值了,那么如何赋值呢?就需要通过为所有成员变量提供get,set方法了,如下:
public class Student {
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
private String id;
private String name;
private String gender;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public void message() {
System.out.println("此学生的个人信息:id="+id+",name="+name+",gender="+gender);
}
}
这样,我们就可以通过set方法来给属性赋值,通过get方法来取出对应的属性,并且可以在set方法中加入一些限定条件来限制赋值的数据了,现在来为setGender();方法添加限定条件吧 ~ ~,如下:
public void setGender(String gender) {
if ("男".equals(gender)||"女".equals(gender)) {
this.gender = gender;
}else {
System.out.println("性别输入非法,请输入\"男\"或者\"女\"");
}
}
这样,如果为gender属性赋值的参数为“男”,“女”之外的属性,就会提示且不会赋值,是不是达到了我们的目标呢?
(3)封装的好处
我们再来系统的总结一下封装的好处吧:
- 能够隐藏该类中一些功能的实现细节,让调用者通过事先实现好的方法访问类中的功能和数据,同时也限制了对类中数据的不合理访问
- 对数据进行检查,有利于保护对象信息的完整和合理性
- 便于对代码的修改和维护,提高代码的可维护性
(4)封装的意义
封装是指将对象的实现细节隐藏起来,然后用公共的方法暴露出来提供给外部进行操作,封装实现了高内聚,低耦合的设计,而类正好是实现封装的一种设计方式
类本身也是一种数据结构,并且是一种可以表示复杂概念的数据结构
三、JavaBean
像上面这样的格式封装的类,我们将它们称为JavaBean,也称POJO类,它的封装步骤如下:
- 首先将各个成员属性的可见性设置为private
- 然后为各个成员属性创建get/set方法实现取值/赋值
四、构造函数
在Java中,类是作为事物相关属性和行为的集合,是对现实世界进行描述的基本单位,我们知道类包含属性和行为,在Java编程语言中可分为几个部分:成员变量、构造方法、成员方法,当我们通过new的方式实例化一个类的对象的时候,就调用了它的构造方法。
1、构造函数的作用与特点
(1)作用
给对象的数据(属性)进行初始化、
(2)特点
- 方法名与类名一致
- 没有返回值类型,连void都没有,如果有一个方法名称与类名一致且有void,这在Java中的合法的,不过会报警告,并且它只是一个普通的成员方法
- 没有返回值,只有一个return
但是,上面的例子中我们没有写构造函数呀,怎么可以new出对象呢?其实它是有一个默认的构造函数的,只是我们看不到而已,当我们实例化一个对象的时候它就会调用默认的无参构造函数的
一个类有无参构造函数,当然它也可以有带参构造函数,但是需要我们注意的是,当我们写了一个有参构造函数后,必须将无参构造函数显示的定义出来,因为有了有参构造函数之后,默认无参构造函数将会被覆盖!!下面来展示一下构造函数:
public class Student {
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
private String id;
private String name;
private String gender;
//无参构造函数
public Student() {
super();
}
//带参构造函数
public Student(String id, String name, String gender) {
super();
this.id = id;
this.name = name;
this.gender = gender;
}
}
测试类代码:
public class Demo {
public static void main(String[] args) {
//通过有参构造函数创建对象并为属性赋值
Student student = new Student("S102", "小明", "男");
student.message();
}
}
运行结果:
好啦,今天的学习就到这里吧!记录学习,记录生活,我还是那个java界的小学生,一起努力吧!!
欢迎各位看官评论探讨哟 ~ ~ 小生在此谢过了 ~ ~