封装的概念
封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private,protected和public实现封装。
什么是封装?
封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。
封装的特点
1.只能通过规定的方法访问数据。
2.隐藏类的实例细节,方便修改和实现。
实现封装的具体步骤如下:
1.修改属性的可见性来限制对属性的访问,一般设为 private。
2.为每个属性创建一对赋值(setter)方法和取值(getter)方法,一般设为 public,用于属性的读写。
3.在赋值和取值方法中,加入属性控制语句(对属性值的合法性进行判断)。
下面以一个员工类的封装为例介绍封装过程。我们假设一个员工的主要属性有姓名、年龄、工资。假设员工类为 Employee,示例如下:
public class Employee {
private String name; // 姓名
private int age; // 年龄
private double balance; // 工资
//定义无参构造方法
public Employee() {
}
//定义有参构造方法
public Employee(String name, double balance, int age) {
this.getBalance();
this.getAge();
this.getName();
}
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 > 18 && age < 45) {
this.age = age;
} else {
System.out.println("年龄必须在18到45之间!");
this. Age = 18; // 默认年龄
}
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
//工资必须大于1000
if (balance>1000){
this.balance = balance;
}else {
System.out.println("error");
}
}
}
如上述代码所示,使用 private 关键字修饰属性,这就意味着除了 Employee 类本身外,其他任何类都不可以访问这些属性。但是,可以通过这些属性的 setXxx() 方法来对其进行赋值,通过 getXxx() 方法来访问这些属性。
在 age 属性的 setAge() 方法中,首先对用户传递过来的参数 age 进行判断,如果 age 的值不在 18 到 45 之间,则将 Employee 类的 age 属性值设置为 18,否则为传递过来的参数值。
编写测试类 TestEmployee,在该类的 main() 方法中调用 Employee 属性的 setXxx() 方法对其相应的属性进行赋值,并调用 getXxx() 方法访问属性,代码如下:
public class TestEmployee {
public static void main(String[] args) {
Employee people = new Employee();
people.setName("小张");
people.setAge(20);
people.setBalance(10000);
//输出信息
System.out.println("姓名:" + people.getName());
System.out.println("年龄:" + people.getAge());
System.out.println("工资:" + people.getBalance());
}
}
封装的作用
① 对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性,降低了程序员保持数据与操作内容的负担。
②对象的数据封装特性还可以把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控性的目的。