本文旨在记录作者学习 Java 的过程。
封装,字面上可以理解为『包装』的意思,换句话说隐藏信息,是指利用抽象的数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在了抽象数据类型的内部,尽可能的隐藏内部细节,只保留一些对外接口使之与外部发生联系。
使用封装的几点好处:
1. 降低耦合度;
2. 类内部的结构可以自由修改;
3. 对成员进行更精准的控制;
4. 隐藏信息
下面我们通过代码来具体说明封装的应用场景。
首先来看一段简单的代码:
package hello;
class People {
String name = "zhangsan";
int age = 30;
}
public class Demo01 {
public static void main(String[] args) {
People person = new People();
person.age = 500;
person.name = "lisi";
System.out.println("Name: " + person.name + " " + "Age: " + person.age );
}
}
我们定义了一个 People 类,接下来通过 main 函数中实例化了一个 People 对象,可以注意到,我们通过 person.age 和 person.name 直接修改了其属性,程序输出:
Name: lisi Age: 500
程序虽然正常输出,但是我们注意到正常情况下一个人的年龄怎么会是 500 岁呢?
因此我们需要在修改对象属性时附加限定条件,不希望将对象的属性直接暴露在外,并且提供一些可以被外界访问对象属性的方法。此时我们可以使用关键字 private,如下:
class People {
private String name = "zhangsan";
private int age = 30;
}
我们将 People 中的 name 和 age 属性前添加了关键字 private,这表示,这个属性只允许内部使用。
那么如果访问这些属性呢?
通过 setattr 和 getattr 对属性进行赋值和取值,如下:
class People {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private String name = "zhangsan";
private int age = 30;
}
我们在 class People 中实现了 getName、 setName、 getAge 和 setAge 方法,通过这些方法对类中的属性进行访问。
如下:
package hello;
class People {
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 <= 0 || age >= 200) {
this.age = 100;
return;
}
this.age = age;
}
private String name = "zhangsan";
private int age = 30;
}
public class Demo01 {
public static void main(String[] args) {
People person = new People();
person.setAge(500);
person.setName("lisi");
System.out.println("Name: " + person.getName() + " " + "Age: " + person.getAge() );
}
}
因此我们可以通过上述的 setAge 和 setName 方法进行限制操作。