访问控制符
目的:是为了控制一个类的成员是否可以被其他类访问。
类型:
Java中提供了3个访问控制符:private,protected,public。除了这三个访问级别外,还有一个不加任何访问控制符的访问控制级别(default),他们之间呈逐次增大的关系,具体如下:
下面我们对这四种访问级别逐个进行讨论:
- private (类访问权限)
被它修饰限定的成员,其访问权限被限制在了成员所在的类的内部,即这个成员只能在当前类的内部被访问。 - default (包访问权限)
被它修饰限定的成员(即不加任何的修饰限定符),其访问权限被限制在了成员所在的包的内部,即其可以被相同包下的其他类使用。 - protected (子类访问权限)
被它修饰限定的成员在default的基础上添加被子类访问的功能,即既能够被同一个包内的其他类访问,还能够被其他包下的子类 访问。(这里的子类所继承的是用protected修饰的成员所在的类) - public (公共访问权限)
被它修饰限定的成员能够被所有类访问,只要是一个工程下即可,不必在同一个包中,也不必要求具有父子继承关系。
使用:
- private:类中的成员变量,以及用于辅助实现该类的其他方法(工具方法)一般都用private进行修饰,从而起到信息隐藏的目的。
- protected:如果一个类主要用作其他类的父类,其中包含的大部分方法可能仅被其子类重写,而不想被外界直接调用,则用protected对其进行修饰。
- public:希望暴露给其他类自由调用的方法应该用public 对其进行修饰。比如:我们经常使用的构造器,为了能够在其他地方创建该类的实例,所以用public修饰。同样外部类为了能够被其他类自由调用,所以大部分外部类也采用public进行修饰。
static
含义:
static是将类的成员变成类 相关,而不是实例相关。用static 修饰的对象不属于外部类的某个对象,而是属于整个类,为整个类所共有。由于被static修饰的对象,被类所共有,所以可以采取类名直接进行引用,不必采取实例化对象之后利用实例进行引用的方式。
使用:
- 由于引用比较简单,所以对于经常使用的方法或者变量,可以尝试用static修饰,之后直接用类名进行调用的方式。
- 静态工厂模式来创建对象,如在接口的定义中,用静态工厂的方式来代替构造器的使用。
思考:外部类为什么不能用static、private、protected进行修饰?
- static: static的作用是把类的成员变量由实例相关变成类相关,而外部类上一级程序单元是包,也即它并不包含于其他类中,所以不可使用static对其进行修饰。
- private: 与static 同样的道理。private的作用是限定被修饰的对象只能在其定义所在的内部进行使用,而外部类不在任何类的内部,它的上一级程序单元是包,所以不可用private对其进行修饰。
- protected: protected是将其修饰的成员对象,能够被其他包下的继承protected修饰对象所在类的子类进行使用。但是对于外部类而言,它不在任何类的内部,所以不能使用protected对其进行修饰。