封装
首先,我们要想一个问题——为什么要进行封装?
以下面代码为例:
Person p = new Person();
p.age = 1000;
在给属性赋值时,设置了一个不合理的值,这样就会导致对象的信息失效,为了避免出现这种问题,我们便要对齐进行封装。
封装的概念:
封装(Encapsulation),是面向对象方法的重要原则,也是面向对象三大特征之一。
其作用是将类的某些属性和操作(服务)结合成一个独立的个体隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
例如:一台计算机内部极其复杂,有主板、CPU、硬盘和内存, 而一般用户不需要了解它的内部细节,不需要知道主板的型号、CPU 主频、硬盘和内存的大小,于是计算机制造商将用机箱把计算机封装起来,对外提供了一些接口,如鼠标、键盘和显示器等,这样当用户使用计算机就非常方便。
适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。
封装的好处:
- 隐藏类的实例细节,方便修改和实现,也增强了代码的可维护性
- 防止对封装数据的未经授权的访问
- 有利于保证数据的完整性
- 只能通过规定的方法访问数据
该如何进行封装呢?
封装的步骤:
- 通过修改属性的访问修饰符,即修改属性的可见性来限制对属性的访问。一般而言,是将可见性设为(private)。
- 为每个属性创建一对公有的赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。(通过这两种方法对数据进行获取和设定,对象通过调用这两种发方法实现对数据的读写)
- 在赋值(setter)方法/取值(getter)方法中加入属性控制语句。(对属性值的合法性进行判断)
访问修饰符:
private:只能在本类中使用(正因为private中的元素不能在外面直接访问,所以才利用调用getter/setter方法访问)
默认:本来和同包中使用
protected:本类,同包,子类中使用
public:本类,同包,子类,其他中都可以使用
封装的应用
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口,封装是一种信息隐藏技术,我们将属性与方法封装到类中 ,将功能的多行代码封装到一个方法中 ,Java将很多功能封装到了工具类中,我们直接使用工具类来完成某些功能 ,我们把一个项目打包成jar包,提供给其他项目使用。
实例:
下面以一个学生类的封装为例介绍封装的过程。
一个大学生的主要属性有姓名、年龄、联系电话和班级。假设学生类为Student。
package com.company;
public class Student
{
private String name; // 姓名
private int age; // 年龄
private String phone; // 联系电话
private int num; //班级号
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
// 对年龄进行限制
if (age < 16 || age > 24) {
System.out.println("年龄必须在16到24之间!");
this.age = 20; // 默认年龄
} else {
this.age = age;
}
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
如上述代码所示,使用 private
但是,可以通过这些属性的赋值(setter)方法来对其进行赋值,通过取值(getter)方法来访问这些属性。
在 age 属性的 setAge() 方法中,首先对用户传递过来的参数 age 进行判断,如果 age 的值不在 16到24之间,则将Student类的 age 属性值设置为 20,否则为传递过来的参数值。
编写测试类 StudentTest,在该类中调用Student属性的赋值(setter)方法对其相应的属性进行赋值,并调用取值(getter)方法访问属性,代码如下:
package com.company;
public class StudentTest
{
public static void main(String[] args)
{
Student people = new Student();
people.setName("小魏");
people.setAge(20);
people.setPhone("18000835964");
people.setNum(24);
System.out.println("姓名:" + people.getName());
System.out.println("年龄:" + people.getAge());
System.out.println("电话:" + people.getPhone());
System.out.println("班级" + people.getNum());
}
}
运行效果为: