Java 访问修饰符用于在 Java 中提供访问控制。
Java 通过三个关键字提供访问控制—— private、protected和public。
我们不会总是使用这些访问修饰符,所以我们还有另一个,即“默认访问”、“包私有”或“无修饰符”。
Java 访问修饰符
我们可以将 Java 访问修饰符与类以及类变量和方法一起使用。
我们只允许在 Java 类中使用“public”或“default”访问修饰符。
- 如果一个类是“public”,那么我们可以从任何地方访问它,即从位于任何其他包中的任何其他类等。
- 我们在一个源文件中只能有一个“public”类,并且文件名应该与公共类名相同。
- 如果该类具有“默认访问权限”,则只能从同一包中的其他类访问它。
带有类成员的 Java 访问修饰符
我们可以为类成员变量和方法使用所有四个访问修饰符。
但是,成员访问修饰符规则在类级别访问规则之后应用。例如,如果一个类具有默认访问权限,那么它在其他包中将不可见,因此该类的方法和变量也将不可见。
我们将分别研究它们中的每一个,然后我们将通过一个简单的程序展示 java 访问修饰符的用法。
Java 访问修饰符 – public 关键字
如果类成员是“公共的”,则可以从任何地方访问它。
成员变量或方法是全局访问的。这是提供对类成员的访问的最简单方法。但是,我们应该注意将此关键字与类变量一起使用,否则任何人都可以更改这些值。通常,类变量被保留为私有,并且提供了 getter-setter 方法来使用它们。
Java 访问修饰符——private 关键字
如果一个类成员是“私有的”,那么它只能在同一个类中访问。这是最受限制的访问,并且类成员对外部世界是不可见的。通常,我们将类变量保持为私有,而将仅在类内部使用的方法保持为私有。
Java 访问修饰符——protected关键字
如果类成员是“受保护的”,那么它只能被同一包中的类和子类访问。此修饰符对私人访问的限制较少,但对公共访问的限制较多。
通常,我们使用这个关键字来确保类变量只能被子类访问。
Java 访问修饰符—— default访问
如果类成员没有指定任何访问修饰符,则将其视为默认访问。
访问规则与类类似,具有默认访问权限的类成员只能被同一包中的类访问。这种访问比公共和受保护的访问更受限制,但比私人的受限制更少。
(最少访问)私有<默认<保护<公共(最易访问)
表总结了上述针对同一包或其他包和子类中不同类的访问修饰符。
我们编写一些简单的类,在这些类中我们将看到 Java 访问修饰符的作用。
TestA.java
package com.journaldev.access;
class TestA {
public void methodPublic(){
methodPrivate();
}
protected void methodProtected(){
methodPrivate();
}
void methodDefault(){
methodPrivate();
}
private void methodPrivate(){}
}
请注意,TestA 类具有默认访问权限,并且同一类的所有其他部分都可以访问私有类方法。
TestB.java
package com.journaldev.access;
import com.journaldev.access.TestA;
public class TestB {
public static void main(String args[]) {
new TestA().methodPublic();
new TestA().methodProtected();
new TestA().methodDefault();
}
public void methodPublic() {
}
protected void methodProtected() {
}
void methodDefault() {
}
private void methodPrivate() {
}
}
请注意,TestB 与 TestA 类在同一个包中,因此它能够访问它的类成员。由于相同的包,私有成员不可访问,但所有其他成员均可访问。
TestC.java
package com.journaldev.access.child;
import com.journaldev.access.TestB;
public class TestC {
public static void main(String[] args) {
new TestB().methodPublic();
}
}
TestB 类是可访问的,因为它是公共的。只有 TestB 类的公共成员可以访问,因为 TestC 类不在同一个包中,也不在 TestB 的子类中。
TestE.java
package com.journaldev.util;
import com.journaldev.access.TestB;
public class TestE extends TestB {
public static void main(String[] args) {
new TestB().methodPublic();
new TestB().methodProtected(); // compile time error
// works, accessing super class protected method using subclass
new TestE().methodProtected();
}
}
由于 TestE 类是 TestB 的子类,我们可以通过子类 TestE 访问 TestB 受保护的成员。如果我们尝试直接访问超类的 protected 方法,我们将得到一个编译时错误。
java访问修饰符就到这里了,简单易懂。只是不要与默认和受保护的访问混淆。
一个容易记住的方法是,默认访问比受保护和受保护成员在子类中可访问受到更多限制。