本文主要讲解Java中的访问控制修饰符与访问权限。
Java修饰符
1 概述
在Java中有很多的修饰符,主要分为以下两类:
- 访问控制修饰符 : default, public , protected, private
- 非访问控制修饰符 : final, abstract, static, synchronized,transient …
修饰符用来定义类、方法或者变量,通常放在语句的最前端。
在此我们只讲述访问控制修饰符。
2 访问控制修饰符
Java中,可以使用访问控制修饰符来控制对类、变量、方法和构造方法的访问。为什么会需要这样的修饰符来限制不同情况下的访问权限呢?让我们举例说明:
比如我有不同的事,其中A我随时可以将它对外公布;B可能是关于我家族内部的事,只有家族中的人可以知道;C则是我家庭内部的事,只有我的家人能知道;最后是D,这是我的私事,只有我知道,连我的孙女也不能知道。
也正是因此,我们通过修饰符可以保证在不同情况下对不同类、对象、方法和构造方法访问的安全。
Java 支持 4 种不同的访问权限:
- public(公有权限) : 对所有类可见。使用对象:类、接口、变量、方法。
- protected (保护权限): 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰外部类。
- default (友好权限): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
- private (私有权限): 在同一类内可见。使用对象:变量、方法。 注意:不能修饰外部类
注: 外部类是一个相对内部类的概念。如果一个类中嵌套了另外一个类,我们就把这个类叫做外部类。
我们可以通过下表来说明访问权限:
这些修饰符的可见性按下面的顺序递增:
2.1 共有访问修饰符-public
被 public 修饰的类、方法、构造方法和接口能够被任何其他类访问。
需要注意的是,如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。由于类的继承性,类所有的公有方法和变量都能被其子类继承。
我们可以注意到,我们的main方法都是使用了共有访问控制。
public static void main(String[] args){
......
}
需要注意的是,Java 程序的 main() 方法必须设置成公有的,否则,Java 解释器将不能运行该类。
2.2 受保护的访问修饰符-protected
事实上,大多数时候我们对protected介绍的比较简单,基本都是一句话,就是:被proteted修饰的成员对于本包和其子类可见。但实际上,protected的可见性在于两点:
- 父类的protected成员是包内可见的,并且对子类可见;
- 若子类和父类不在同一包中,那么在子类中,子类的实例可以访问其从父类继承的protected方法,但不能访问父类实例的protected方法。
对于涉及protected成员的调用时,我们首先应当确定这个protected成员来源于哪里,其可见性范围是什么,由此可以判断出当前的用法是否恰当。
我们通过两个例子来进行讲解。
package PackeageA;
public class A {
protected void f() {
} // 父类A中的protected方法
}
package PackeageA;
public class A1 extends A{
}
package PackeageA;
public class A2 extends A{
}
package PackeageA;
public class ATest {
public static void main