Java访问修饰符用于在Java中提供访问控制。Java通过三个关键字提供访问控制 – private,protected和public。我们不总是需要使用这些访问修饰符,因此我们还有另一个,即“默认访问”,“包私有”或“无修饰符”。
Java访问修饰符
我们可以在类以及类变量和方法中使用Java访问修饰符。我们只能在Java类中使用“public”或“default”访问修饰符。
- 如果一个类是“public”,那么我们可以从任何地方访问它,即从任何其他位于任何其他包中的类访问它等。
- 我们在源文件中只能有一个“public”类,文件名应与公共类名相同。
- 如果类具有“默认访问权限”,那么它只能从同一包中的其他类访问。
Java访问修饰符与类成员
我们可以为类成员变量和方法使用所有四个访问修饰符。但是,在应用成员访问修饰符规则之前,会应用类级别的访问规则。例如,如果一个类具有默认访问权限,则它在其他包中将不可见,因此该类的方法和变量也将不可见。我们将分别查看每一个,然后展示带有简单程序的Java访问修饰符用法。
Java访问修饰符 – public关键字
如果一个类成员是“public”,那么它可以从任何地方访问。成员变量或方法是全局访问的。这是提供对类成员访问的最简单方法。但是,我们应该小心使用这个关键字与类变量,否则任何人都可以更改值。通常,类变量保持为私有,并提供getter-setter方法来处理它们。
Java访问修饰符 – private关键字
如果一个类成员是“private”,那么它只能在同一个类内部访问。这是最受限制的访问级别,该类成员对外部世界不可见。通常,我们将类变量设置为私有,并将只在类内部使用的方法设置为私有。
Java访问修饰符 – protected关键字
如果类成员是“protected”,那么它只能被相同的包中的类和子类访问。这个修饰符从private访问级别更宽松,但比public访问级别更受限制。通常,我们使用这个关键字确保类变量只能被子类访问。
Java访问修饰符 – 默认访问
如果一个类成员没有指定任何访问修饰符,那么它将被视为默认访问。访问规则与类相似,具有默认访问权限的类成员仅对同一包中的类可见。这种访问权限比public和protected更受限,但比private更宽松。 (最不可访问) private < default < protected < public(最可访问)下表总结了上述访问修饰符与同一包或其他包中的不同类及其子类的关系。 让我们编写一些简单的类,看看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的受保护成员。如果我们尝试直接访问超类的受保护方法,将会得到编译时错误。这就是关于Java访问修饰符的全部内容,很容易理解。只是不要将默认访问和受保护访问搞混。一个记忆的简单方法是,默认访问比受保护访问更受限制,并且受保护成员可以在子类中访问。最近我制作了一段视频详细解释Java访问修饰符,你可以在下面的YouTube链接中观看。https://www.youtube.com/watch?v=QKjnbC3UBtY
Source:
https://www.digitalocean.com/community/tutorials/java-access-modifiers