Java通过三个关键字提供访问控制 - 私有, 保护和 公共. 我们不需要总是使用这些访问修改器,所以我们还有另一个,即**默认访问**
,**包私有**
或**没有修改器**
。
Java 访问修正器
We can use java access modifiers with Classes as well as Class variables and methods. We are allowed to use only "public" or "default" access modifiers with java classes.
如果一个类是公有
,那么我们可以从任何地方访问它,即从任何其他类位于任何其他包中等.
2.我们可以在源文件中只有一个公有
类,并且文件名应该与公有类名称相同
3.如果该类有默认访问
,那么它只能从同一包中的其他类访问
Java Access 修正器与类成员
我们可以为班级成员变量和方法拥有四个访问修改器,但是,会员访问修改器规则在班级级访问规则之后得到应用,例如,如果一个班级有默认访问,那么它不会在其他包中可见,因此该班级的方法和变量也不会可见。
Java Access Modifiers - 公共关键字
如果一个类成员是公共
,那么它可以从任何地方访问。成员变量或方法是全球访问的。这是提供访问类成员的最简单的方式。然而,我们应该注意使用这个关键字与类变量,否则任何人都可以更改值。
Java Access Modifiers - 隐私关键字
如果一个类成员是私有
,那么它将只在同一类内访问。这是最受限制的访问,而该类成员将不会被外部世界所看到。
Java Access Modifiers - 受保护的关键字
如果类成员是受保护的
,那么它只会被访问到 _同一包中的类和 subclasses. 这种修改器不太受到私人限制,但更受到公共访问限制. 通常,我们使用这个关键字来确保类变量只能被访问到子类。
Java Access Modifiers - 默认访问
If a class member doesn't have any access modifier specified, then it's treated with default access. The access rules are similar to classes and the class member with default access will be accessible to the classes in the same package only. This access is more restricted than public and protected but less restricted than private. (Least Accessible) private < default < protected < public (Most Accessible) The below table summarise above access modifiers with respect to different classes in the same package or other packages and subclasses. Let's write some simple classes where we will see the java access modifiers in action.
TestA.java
1package com.journaldev.access;
2
3class TestA {
4
5 public void methodPublic(){
6 methodPrivate();
7 }
8
9 protected void methodProtected(){
10 methodPrivate();
11 }
12
13 void methodDefault(){
14 methodPrivate();
15 }
16
17 private void methodPrivate(){}
18}
请注意,TestA 类具有默认访问,私人类方法可以访问同一类的所有其他部分。
1package com.journaldev.access;
2
3import com.journaldev.access.TestA;
4
5public class TestB {
6
7 public static void main(String args[]) {
8 new TestA().methodPublic();
9 new TestA().methodProtected();
10 new TestA().methodDefault();
11
12 }
13
14 public void methodPublic() {
15
16 }
17
18 protected void methodProtected() {
19
20 }
21
22 void methodDefault() {
23
24 }
25
26 private void methodPrivate() {
27 }
28
29}
请注意, TestB 与 TestA 类相同的包中,因此它可以访问它的类会员。私人会员无法访问,但所有其他会员都可通过相同的包访问。
1package com.journaldev.access.child;
2
3import com.journaldev.access.TestB;
4
5public class TestC {
6
7 public static void main(String[] args) {
8 new TestB().methodPublic();
9 }
10
11}
TestB 类是可访问的,因为它是公共的. 只有 TestB 类的公开成员是可访问的,因为 TestC 类不在同一包中,也不是 TestB 的子类。
1package com.journaldev.util;
2
3import com.journaldev.access.TestB;
4
5public class TestE extends TestB {
6
7 public static void main(String[] args) {
8 new TestB().methodPublic();
9 new TestB().methodProtected(); // compile time error
10
11 // works, accessing super class protected method using subclass
12 new TestE().methodProtected();
13
14 }
15
16}
由于TestE类是TestB的子类,我们可以通过儿童类TestE访问TestB受保护的成员。如果我们试图直接访问超级类受保护的方法,我们会收到编译时间错误。这对于Java访问修改器来说都是如此,很容易理解。只需不要与默认和受保护的访问混淆。记住一个简单的方法是默认访问比受保护和受保护的成员在子类中更受限制。最近我制作了一个视频来详细解释Java访问修改器,你可以在YouTube上观看。