在面向对象程序设计方法中,封装(Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。封装是面向对象的一大特性。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程序更容易理解与维护,也加强了程式码的安全性。
封装的优点
- 良好的封装能够减少耦合。
- 类内部的结构可以自由修改。
- 可以对成员变量进行更精确的控制。
- 隐藏信息,实现细节。
实现Java封装的步骤
为属性封装:private 属性类型 属性名称;
为方法封装:private 方法返回值 方法名称(参数列表){}
package charjava;
public class java9 {
private String name; // 属性封装
private void Person() { // 方法封装
}
}
getter和setter方法
属性或方法封装后,不能由对象直接进行访问;为了解决属性必须封装且又必须访问的矛盾,在Java开发中对于私有属性的访问有以下的明确定义:”只要是被封装的属性,则必须通过setter和getter方法设置和取得。
例:
package charjava;
public class java9 {
public static void main(String[] args) {
Person per = new Person(); // 声明并实例化对象
per.setName("张三"); // 调用setter设置姓名
per.setAge(30); // 调用setter设置年龄
per.tell(); // 输出信息
}
}
class Person {
private String name; // 声明姓名属性
private int age; // 声明年龄属性
public void tell() { // 取得信息的方法
System.out.println("姓名:" + getName() +",年龄:" + getAge());
}
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;
}
}
采用this关键字是为了解决实例变量(pirvate String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
关于private的补充说明
- 类中全部属性都必须封装,封装之后的属性必须通过setter和getter方法进行访问。
- 面向对象的封装本身并不是单指private关键字,private声明的属性或方法只能在其类的内部被调用,而不是在类的外部被调用。
- 正常情况下,类中的方法直接写上方法名称就可以完成本类中的方法调用,如果在此时非要强调是本类中的方法,也可以在调用的时候按”this.方法名称()“的形式编写:
public void tell() {
System.out.println("姓名:" + this.getName() + ",年龄:" + this.getAge());