今天我们讨论java类的另外一个重要的特点——封装。封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中通过关键字private实现封装。封装把对象的所有组成部分组合在一起,封装定义程序如何引用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。
类的每一个成员都有一个访问修饰符用来判断谁可以访问改成员。访问修饰符允许我们在设计程序的时候就考虑谁可以访问一个对象的不同属性和行为。java中,为类中的成员提供了四中访问级别,我在这里用表格来表示他们访问的不同:
访问类型
本类
同包子类
同包非子类
不同包子类
不同包非子类
public
√
√
√
√
√
protected
√
√
√
√
×
默认
√
√
√
×
×
private
√
×
×
×
×
公开访问级别:使用public关键字修饰,所修饰的成员对外公开,公开成员可以被任何其他对象访问。
受保护访问级别:使用protected关键字修饰,受保护成员可以被同一包中的类所访问,还可以被类的子类所访问,不管子类在哪个包里。
默认访问级别:没有访问修饰符,默认级别访问成员可以被同一包中的其他类所访问。
私有访问级别:使用private关键字修饰,私有访问成员只有类本身可以访问,不对外公开,是四中访问修饰符中级别最低的。
封装的有点有:重用(代码上的重用),利于分工和隐藏细节。封装使类的成员变量都定义成private,并提供public方法访问这些成员变量。如果一个成员变量被定义成public方法来访问设置这些私有成员,我们在定义public方法是就可以加入一些限制条件,从而就一定程度上增加了成员变量的安全性。下面举个列子:
public class Student {
private int id;
private String name;
private String sex;
private int age;
//id访问修改方法
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
//name访问修改方法
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
//sex访问修改方法
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex=sex;
}
//age访问修改方法
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
}
另外java中还有用关键字static定义的静态成员变量和方法,值得一提的是静态方法是不能访问非静态成员变量和方法的,静态初始化块仅在类的加载时发生一次。