一、概述
Java 语言中有四个关键字用于定义变量、函数、类等的权限,分别为 public、protected、default、private,所对应的访问权限依次从大到小。
二、示例和说明
(1)private 关键字定义的权限
以 private 关键定义的类的成员只能被类中的方法所访问。
// 在类中以 private 定义一个变量,然后定义该变量的访问方法
class Demo {
private int a;
// 以构造函数提供访问变量 a 的方法
Demo (int a) {
this.a = a;
}
// 以 setter 和 getter 方法提供访问 a 的方法
void SetA (int a) {
this.a = a;
}
int getA () {
return a;
}
}
// 在主函数中通过类中提供的方法访问类中的私有变量
class PrivateDemo {
public static void main (String[] args) {
Demo d = new demo(4);
int a = d.getA();
d.setA(5);
}
}
在其他类中必须要通过在 Demo 类中定义的带参数的构造方法或 setter 和 getter 方法才能访问 Demo 类中的私有变量 a。
(3)default 关键字
default 关键字通常不用书写,没有使用权限关键字定义的变量、函数、类等默认都是以 default 关键字修饰的,在这种情况下,同一个包中其他类都可以通过该类的对象访问该变量或方法,如果该变量或方为静态,也可以通过类名直接访问。
// 在类中定义默认权限的变量和方法,以及静态变量
class Demo {
int a = 1;
static int b = 2;
void show () {
System.out.println(a+b);
}
}
// 在主函数通过类名直接访问静态变量,并通过 Demo 类对象访问非静态变量和方法
class DefaultDemo {
public static void main (String[] args) {
int b = Demo.b;
Demo d = new demo();
int a = d.a;
d.show();
}
}
(3) public 和 protected 关键字
使用 public 关键修饰的变量、方法和类可以被其他包中的类所访问,访问方法与使用 default 关键字修饰情况相同,而使用 protected 关键字修饰的变量、方法和类可以被其他包中的该类的的子类访问,而不能被其他类访问。
// 在包 PackA 中定义两个类,一个用 public 修饰,一个以 protected 修饰
package PackA
public class PubDemo {
public int a = 0;
public void show () {
System.out.println(a);
}
}
protected class ProDemo {
protected int b = 1;
protected void show () {
System.out.println(b);
}
}
// 在包 PackB 中的 Demo 类中访问 PackA.PubDemo 类的对象中的成员和变量
package PackB
class Demo {
public static void main (String[] args) {
PackA.PubDemo p = new PackA.PubDemo();
int a = p.a;
p.show();
}
}
// 定义一个 PackA.ProDemo 类的子类并重写该类中的方法
class Child extends PackA.ProDemo {
protected void show () {
System.out.println("Override");
}
在上面的代码中,如果 PackA.PubDemo 类中的变量和方法没有 public 关键字,其他包中的类即使能够建立该类的对象,也不能访问类中的变量和方法。而 PackB 包中的 Child 类在继承了 PackA.ProDemo 之后,在重写其方法时,定义的方法的权限必须为 protected 或 public。