程序员社区

详解Java中的访问修饰符

Java 访问修饰符用于在 Java 中提供访问控制。

Java 通过三个关键字提供访问控制—— privateprotectedpublic

我们不会总是使用这些访问修饰符,所以我们还有另一个,即“默认访问”、“包私有”或“无修饰符”。

Java 访问修饰符

我们可以将 Java 访问修饰符与类以及类变量和方法一起使用。

我们只允许在 Java 类中使用“public”或“default”访问修饰符。

  1. 如果一个类是“public”,那么我们可以从任何地方访问它,即从位于任何其他包中的任何其他类等。
  2. 我们在一个源文件中只能有一个“public”类,并且文件名应该与公共类名相同。
  3. 如果该类具有“默认访问权限”,则只能从同一包中的其他类访问它。

带有类成员的 Java 访问修饰符

我们可以为类成员变量和方法使用所有四个访问修饰符。

但是,成员访问修饰符规则在类级别访问规则之后应用。例如,如果一个类具有默认访问权限,那么它在其他包中将不可见,因此该类的方法和变量也将不可见。

我们将分别研究它们中的每一个,然后我们将通过一个简单的程序展示 java 访问修饰符的用法。

Java 访问修饰符 – public 关键字

如果类成员是“公共的”,则可以从任何地方访问它。

成员变量或方法是全局访问的。这是提供对类成员的访问的最简单方法。但是,我们应该注意将此关键字与类变量一起使用,否则任何人都可以更改这些值。通常,类变量被保留为私有,并且提供了 getter-setter 方法来使用它们。

Java 访问修饰符——private 关键字

如果一个类成员是“私有的”,那么它只能在同一个类中访问。这是最受限制的访问,并且类成员对外部世界是不可见的。通常,我们将类变量保持为私有,而将仅在类内部使用的方法保持为私有。

Java 访问修饰符——protected关键字

如果类成员是“受保护的”,那么它只能被同一包中的类和子类访问。此修饰符对私人访问的限制较少,但对公共访问的限制较多。

通常,我们使用这个关键字来确保类变量只能被子类访问。

Java 访问修饰符—— default访问

如果类成员没有指定任何访问修饰符,则将其视为默认访问。

访问规则与类类似,具有默认访问权限的类成员只能被同一包中的类访问。这种访问比公共和受保护的访问更受限制,但比私人的受限制更少。

(最少访问)私有<默认<保护<公共(最易访问)

表总结了上述针对同一包或其他包和子类中不同类的访问修饰符。

file

我们编写一些简单的类,在这些类中我们将看到 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访问修饰符就到这里了,简单易懂。只是不要与默认和受保护的访问混淆。

一个容易记住的方法是,默认访问比受保护和受保护成员在子类中可访问受到更多限制。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 详解Java中的访问修饰符

一个分享Java & Python知识的社区

登录

注册