本文是《Java学习指南》原书的网络版,作者邵发,拥有本书的全部权利。相关视频课程在此查看。
目录
第9章 访问控制与封装
9.1 访问修饰符
9.2 Getter与Setter
访问修饰符 ( Access Modifier ),是指在属性和方法前面用于访问控制的关键字。本章介绍两个访问修饰符:public和private。
其中,public是我们一直使用的,用在属性和方法的前面,例如,
简单的讲,public表示公开的,private则表示私有的、私密的。
这就好比一个家(class),其客厅是public的,而卧室则是private的。
9.1.1 私有的private
当一个属性/方法被声明为private,则表示它是私有的。此时,不允许外部访问它。
例如,
public class Example
{
private int number = 10; // 声明为私有
}
则在外部无法访问number属性,例如,
public class HelloWorld
{
public static void main(String[] args)
{
Example ex = new Example();
ex.number = 10; // 错误!
}
}
此时Eclipse会提示"The field is not visible" 的错误,告诉我们不能在HelloWord类里访问Example类的number属性。
强调一下,这里所谓的“外部”,是指Example类的外面。比如,在HelloWorld里访问Example就算是外部。
9.1.2 可见性 visibility
可见性和可访问性是同一回事:如果一个属性/方法可以访问,就可以说成是可见的(visible);反之,就是不可见的(not visible)。
在Eclipse里自动提示时,对于private的属性/方法会自动过滤,不会显示在候选下拉列表里。这正说明了什么是可见性。
v public: 外部可以访问的,可见的
v private: 外部不可以访问的,不可见的
值得一提的是,在类里的内部访问时,不受private的限制。例如,
public class Example
{
private int number = 10;
public void show ()
{
System.out.println("值为" + this.number);
}
}
其中,属性number是private的,但是在show()里可以访问。
因为它们好比是一家人,家庭内部自然是不受private限制的。所谓的可见性,是对外人而言的。
public和private的含义其实比较简单,理解起来应该没有太大问题。真正的问题在于应用,即什么时候该用public,什么时候该用private,是一个问题。
其使用原则是:如果仅供内部使用,则设为private;如果是提供给外部使用的,用 public。
初学者在练习时,如果难以决定,则可以统一设为private;当需要在外部访问时,则再改成public就可以了。例如,
public class Example
{
private int number ; // 将所有属性设为private
}
9.2.1 Getter方法
如果外部要获取这个number的值,则可以添加一个方法用于获取属性的值,例如,
public class Example
{
private int number ;
public int getNumber()
{
return number;
}
}
像getNumber()这种,用于获取属性的值的方法,称为Getter方法。其名字是一般以get打头,后面加上属性的名字,并将首字母大写。
其命名规律示例如下,
number -> getNumber()
name -> getName()
numView -> getNumView()
9.2.2 Setter方法
同理,如果外部想要设置number的值,就得添加一个Setter方法,示例如下,
public class Example
{
private int number ;
public void setNumber(int number)
{
this.number = number;
}
}
Setter方法的命名规律基本类似,只是以set打头的,并且传递一个同类的参数。
使用 Getter / Setter 方法,就可以灵活地对一个属性进行访问控制。
v 读/写: Getter/Setter
v 只读 : 仅 Getter
v 禁止读/写: private,并且没有Getter/Setter
比如,
public class Example
{
private int number ;
public int getNumber()
{
return number;
}
}
由于 number 属性只有 Getter、没有Setter,所以它对外是只读的。在外部,可以用getNumber() 获取属性的值。示例如下,
Example e = new Example();
int num = e.getNumber(); // 获取属性的值
9.2.3 封装
封装是一种设计思路,它指的是将实现细节封装到内部,是用户不可见的;用户能操作的接口,设为用户可见的。
打个比方,一台电视机就是做了很好的封装设计。其内部的实现细节是相当复杂的,有各种元器件、线路、线圈。它们被封装在了内部,是不可见的。而对外暴露给用户的,则是显示屏、按钮、信号输入插孔等,这个是可见的。如下图所示,
我们在设计类的时候,也应参考这种设计思想。把不该让用户看到的东西,封装在内部(设为private) ;把应该让用户看到的东西,设为public。