今天来回忆一下Java的封装。
在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
有一句话来盖过:封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法 来实现对隐藏信息的操作和访问。
封装的优点
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
封装的特点:
只能通过规定的方法访问数据。
隐藏类的实例细节,方便修改和实现。
实现封装的具体步骤如下:
修改属性的可见性来限制对属性的访问,一般设为 private。
为每个属性创建一对赋值(setter)方法和取值(getter)方法,一般设为 public, 用于属性的读写。
在赋值和取值方法中,加入属性控制语句(对属性值的合法性进行判断)。
实例:
假设学生类为 Employee,示例如下:
public class Employee {
private String name;//姓名
private int age;//年龄
private String phone;//联系电话
private String address;//家庭住址
private String xiehao;//学号
private String ban;//班别
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>20) {this.age = age; }else{this.age=16;//默认年龄}
}
public String getPhone() {return phone; }
public void setPhone(String phone) {this.phone = phone; }
public String getAddress() {return address; }
public void setAddress(String address) {this.address = address;}
public String getBan() {return ban; }
public void setBan(String ban) {this.ban = ban; }
public String getXiehao() {return xiehao; }
public void setXiehao(String xiehao) {this.xiehao = xiehao; }
@Override
public String toString() {
return "Employee [name=" + name +", age=" + age
+ ",ban="+ban+",xiehao="+xiehao+", phone=" + phone
+ ", address=" + address + "]";
}
}
编写测试类 EmployeeTest,在该类的 main() 方法中调用 Employee 属性的 setXxx() 方法对其 相应的属性进行赋值,并调用 getXxx() 方法访问属性,代码如下:
public class EmployeeTest {
public static void main(String[] args) {
Employee people=new Employee();
people.setName("张三");
people.setAge(16);
people.setPhone("0123456789");
people.setAddress("广东省广州市");
people.setBan("xx班");
people.setXiehao("X200010110");
System.out.println("姓名:"+people.getName());
System.out.println("年龄:"+people.getAge());
System.out.println("电话:"+people.getPhone());
System.out.println("家庭住址:"+people.getAddress());
System.out.println("班别:"+people.getBan());
System.out.println("学号:"+people.getXiehao());
System.out.println(people.toString());
}
}
代码结果: