在Java中,有四种访问权限控制符:private
、default
(也称为包级私有)、protected
和 public
。这些访问权限控制符决定了类、接口、成员变量和成员方法的访问级别。以下是这些访问权限控制符及其区别的详细说明:
- private
private
是最严格的访问级别。一个被声明为private
的成员只能在定义它的类中被访问。- 它提供了对成员的完全封装,外界不能访问也不能修改它(除了通过类中提供的方法)。
- 类的私有成员变量和方法通常用于存储和操作类的内部状态。
- default(包级私有)
- 如果没有指定任何访问修饰符,那么成员变量或方法将被隐式地声明为
default
访问级别。 default
访问级别意味着成员变量或方法可以被定义它的类所在的包中的任何其他类访问。- 在包外,这些成员是不可见的。
- 如果没有指定任何访问修饰符,那么成员变量或方法将被隐式地声明为
- protected
protected
成员可以被定义它的类以及同包中的其他类访问。- 此外,它还可以被不同包中的子类访问(即使子类位于不同的包中)。
- 它提供了一种机制,使得子类可以访问并修改父类的某些状态,同时保持这些状态对包外的其他类不可见。
- public
public
是最宽松的访问级别。成员变量或方法可以被任何其他类访问,无论它们是否在同一包中。public
成员通常用于表示类的API,即类希望被其他类使用的部分。
以下是使用案例:
private
使用案例
public class Person {
private String name; // 私有字段,只能在Person类内部访问
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
// 没有提供setName方法,因为name字段是私有的
}
default
(包级私有)使用案例
// 假设这个类在com.example.package包中
class PackagePrivateClass {
String packagePrivateField; // 包级私有字段,只能在同包的其他类中访问
void packagePrivateMethod() {
// ...
}
}
protected
使用案例
public class Animal {
protected String species; // 受保护的字段,可以在Animal类、同包的其他类以及子类中访问
protected void makeSound() {
// ...
}
}
// 假设这个类在另一个包中,但它是Animal的子类
public class Dog extends Animal {
public void bark() {
System.out.println("Barking...");
makeSound(); // 可以访问父类的protected方法
}
}
public
使用案例
public class PublicClass {
public static final int CONSTANT = 10; // 公共常量
public String publicField; // 公共字段
public void publicMethod() {
// ...
}
}
// 其他类可以访问PublicClass及其公共成员
public class OtherClass {
public static void main(String[] args) {
System.out.println(PublicClass.CONSTANT); // 可以访问PublicClass的公共常量
PublicClass pc = new PublicClass();
System.out.println(pc.publicField); // 可以访问PublicClass的公共字段
pc.publicMethod(); // 可以调用PublicClass的公共方法
}
}
区别总结:
private
成员只能在定义它们的类中被访问。default
(或没有修饰符)成员可以在定义它们的类和同包的其他类中被访问。protected
成员可以在定义它们的类、同包的其他类以及不同包中的子类中被访问。public
成员可以在任何地方被访问。
了解这些访问权限控制符并正确使用它们,是编写健壮、可维护的Java代码的关键。