一、面向对象中,封装是指将抽象性函式接口的实现细节部分包装、隐藏起来的方法
1.封装可以被认为是一个屏障,防止该类的代码和数据被外部类定义的代码随机访问
2.要访问该类代码和数据需要接口控制
3.封装可以修改自己的实现代码,而不用修改调用我们代码的程序片段
4.精确控制成员变量
5.隐藏信息,实现细节
二、封装的步骤
1.修改属性的可见性来限制对属性的访问(一般用private来限制)
这段代码中 将name和age属性设置为私有,只有本类可以访问,其他类访问不了
public class Person {
private String name;
private int age;
}
2.对每个值属性提供对外的公有方法访问,用于对私有属性的访问
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
三、举例
定义一个Person类,给类定义一个私有属性age,setAge和getAge方法是为了别的类访问Person类的私有属性age定义的 代码如下:
class Person {
private int age;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Foo {
public static void main(String[] args) {
// 一个类的私有属性在其他类中只能通过get和set方法去访问
Person p = new Person();
p.setAge(18);// 设置属性age的值
int age = p.getAge();
System.out.println(age);// 输出为5
}
}
运行结果:18
四、举例2
下面实例public方法是外部类访问该类成员变量的入口,这些方法被称为getter和setter方法,因此要访问类中私有成员变量的类都要通过这些getter和setter方法
调用方法:
public class RunEncap {
public static void main(String[] args) {
EncapTest encap = new EncapTest();
encap.setName("dd");
encap.setAge(20);
encap.setIdNum("1234ms");
System.out.println("Name:" + encap.getName() + "Age:" + encap.getAge());
}
}
public class EncapTest {
private String name; // 私有成员变量
private String idNum;
private int age;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getIdNum() {
return idNum;
}
public void setAge(int newAge) {
age = newAge;
}
public void setName(String newName) {
name = newName;
}
public void setIdNum(String newId) {
idNum = newId;
}
}
运行结果: Name:dd Age:20