封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和方法(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。所以说类就是一个封装体,封装了属性和方法。
封装的好处: 1)隐藏实现细节。 2)可以对成员变量进行更精确的控制,提高了安全性。
请看以下代码:
public class Person {
String name;
String gender;
int age;
Person(){
System.out.println("一个人从世界上诞生了...");
}
public Person(String name, String gender, int age) {
this();
this.name = name;
this.gender = gender;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person("张三","男",18);
p1.gender = "女"; //外部类可以随意修改一个人的性别,有悖常理。
System.out.println(p1);
Person p2 = new Person("翠花","女",38);//年龄是女人的秘密,可以随意获取真实年龄吗?
System.out.println(p2.age);
}
}
运行结果:
一个人从世界上诞生了...
Person{name='张三', gender='女', age=18}
一个人从世界上诞生了...
38
在上例中,人出生后性别一般的不会发生改变的,所有性别属性应该只能读取,不能修改。年龄是女人的秘密,所有你获取到的永远不是女人的真实年龄。如何才能做到以上功能呢?我们需要对属性进行封装。

Person类改下为如下效果:
public class Person {
private String name;
private String gender;
private int age;
Person(){
System.out.println("一个人从世界上诞生了...");
}
public Person(String name, String gender, int age) {
this();
this.name = name;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public int getAge() {
if("女".equals(this.gender)){
return 18;
}
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + this.getName() + '\'' +
", gender='" + this.getGender() + '\'' +
", age=" + this.getAge() +
'}';
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person("张三","男",18);
//p1.gender = "女"; //性别属性是只读的,不允许直接修改。
System.out.println(p1);
Person p2 = new Person("翠花","女",38);
System.out.println(p2.getAge()); //返回了不真实的年龄,隐藏实现的细节。
}
}
运行结果:
一个人从世界上诞生了...
Person{name='张三', gender='男', age=18}
一个人从世界上诞生了...
18