在Java中,有四种访问控制符,它们分别是public
、protected
、default
(包级私有,未使用任何修饰符)、private
。每种访问控制符决定了类、变量、方法和构造函数的可见性和访问权限。下面详细介绍每种访问控制符的作用范围和使用场景:
1. public
- 作用范围:
public
修饰的成员可以被任何其他类访问,不论它们是否在同一个包中。 - 使用场景:
- 公共的API方法和类:希望被所有其他类使用的功能性方法和类。
- 常量:需要全局访问的常量通常被声明为
public
且是static final
。
public class Example {
public int publicVar = 10;
public void publicMethod() {
System.out.println("This is a public method.");
}
}
// 其他类访问
class Test {
public static void main(String[] args) {
Example example = new Example();
System.out.println(example.publicVar); // 访问public变量
example.publicMethod(); // 调用public方法
}
}
2. private
- 作用范围:
private
修饰的成员只能在它们所在的类内部访问,不能在类外部访问,即使是在同一个包中。 - 使用场景:
- 封装:隐藏类的实现细节,防止外部直接访问类的内部数据。
- 内部方法和变量:只在类内部使用的方法和变量。
public class Example {
private int privateVar = 10;
private void privateMethod() {
System.out.println("This is a private method.");
}
public int getPrivateVar() {
return privateVar;
}
public void setPrivateVar(int privateVar) {
this.privateVar = privateVar;
}
}
// 其他类访问
class Test {
public static void main(String[] args) {
Example example = new Example();
// System.out.println(example.privateVar); // 错误:private变量无法访问
System.out.println(example.getPrivateVar()); // 通过public方法访问private变量
}
}
3. protected
- 作用范围:
protected
修饰的成员可以在同一个包中的其他类以及不同包中的子类访问。 - 使用场景:
- 继承:希望子类能访问的成员。
- 同包访问:希望同一个包中的其他类也能访问的成员。
public class Example {
protected int protectedVar = 10;
protected void protectedMethod() {
System.out.println("This is a protected method.");
}
}
// 同一个包中的其他类访问
class Test {
public static void main(String[] args) {
Example example = new Example();
System.out.println(example.protectedVar); // 访问protected变量
example.protectedMethod(); // 调用protected方法
}
}
// 不同包中的子类访问
package different;
import Example;
public class SubExample extends Example {
public void accessProtected() {
System.out.println(protectedVar); // 访问protected变量
protectedMethod(); // 调用protected方法
}
}
4. default
(包级私有)
- 作用范围:未使用任何访问控制修饰符(即“默认”访问级别)修饰的成员只能在同一个包中的其他类访问。
- 使用场景:
- 包级访问:希望同一个包中的其他类能访问,但不同包中的类不能访问。
class Example {
int defaultVar = 10; // 默认访问级别
void defaultMethod() {
System.out.println("This is a default method.");
}
}
// 同一个包中的其他类访问
class Test {
public static void main(String[] args) {
Example example = new Example();
System.out.println(example.defaultVar); // 访问default变量
example.defaultMethod(); // 调用default方法
}
}
// 不同包中的类无法访问
package different;
import Example;
public class DifferentClass {
public void accessDefault() {
Example example = new Example();
// System.out.println(example.defaultVar); // 错误:default变量无法访问
// example.defaultMethod(); // 错误:default方法无法访问
}
}
总结
-
public
:- 作用范围:任何地方都可以访问。
- 使用场景:公共API、常量、希望全局访问的类和方法。
-
private
:- 作用范围:只能在类内部访问。
- 使用场景:封装内部数据和方法。
-
protected
:- 作用范围:同一个包中的其他类和不同包中的子类可以访问。
- 使用场景:继承中使用,允许子类访问的成员。
-
default
(包级私有):- 作用范围:同一个包中的其他类可以访问。
- 使用场景:包级访问,隐藏实现细节但允许包内共享。
评论区