Java 访问修饰符

在 Java 中,访问修饰符用于设置类、接口、类成员和方法的可访问性(可见性)。在本教程中,我们将通过示例了解 Java 访问修饰符、它的类型以及如何使用它们。

在本教程中,我们将通过示例了解 Java 访问修饰符、它的类型以及如何使用它们。

什么是访问修饰符?

在 Java 中,访问修饰符用于设置类、接口、类成员和方法的可访问性(可见性)。例如,

public class Animal {
  public void method1() {...}

  private void method2() {...}
}

在上面的例子中,我们声明了 2 个方法:method1()method2()。这里,

  • method1()public - 这意味着它可以被其他类访问。
  • method2()private - 这意味着它不能被其他类访问。

注意关键字 publicprivate 。这些是 Java 中的访问修饰符。它们也称为可见性修饰符。

访问修饰符

在您了解访问修饰符的类型之前,请确保您了解 Java 包的知识。

Java 中有四个访问修饰符关键字,它们是:

修饰符 描述
default 声明仅在包内可见(包私有)
private 声明仅在类中可见
protected 声明在包或所有子类中可见
public 声明随处可见

default 访问修饰符

如果我们没有为类、方法、变量等明确指定任何访问修饰符,那么就默认为是默认访问修饰符。例如,

package default_package;

public class Logger {
    void message(){
        System.out.println("This is a message");
    }
}

在这里, Logger 类的 message() 具有默认访问可见性,只有在类所在包中的其他类才可以看到和使用 message() 方法。如果我们尝试 在 default_package 之外的包的另一个类中使用 Logger 类的 message() 方法,我们会得到一个编译错误。

private 访问修饰符

声明为 private 的类属性和方法不能在类之外被访问。例如,

class Data {
    // 私有属性
    private String name;
}

public class Main {
    public static void main(String[] main){

        Data d = new Data();

        // 访问 Data 的私有属性
        d.name = "GoBeta.NET";
    }
}

在上面的例子中,我们在 Data 类中声明了一个名为 name 的私有属性, 当我们运行程序时,会出现以下错误:

Main.java:18: error: name has private access in Data
        d.name = "GoBeta.NET";
         ^

产生错误是因为我们试图 Data 类中的私有属性 name

您可能想知道如果我们需要访问这些私有属性怎么办。在这种情况下,我们可以使用 getter 和 setter 方法。例如,

public class Data {
    private String name;

    // getter 方法
    public String getName() {
        return this.name;
    }
    // setter 方法
    public void setName(String name) {
        this.name= name;
    }
}

public class Main {
    public static void main(String[] main){
        Data d = new Data();

        // 通过 setter 和 gettter 访问私有属性
        d.setName("GoBeta.NET");
        System.out.println(d.getName());
    }
}

输出

GoBeta.NET

在上面的例子中,我们有一个名为 name 的私有属性。为了从外部类访问变量,我们使用了方法: getName()setName() 。这些方法在 Java 中称为 getter 和 setter。

在这里,我们使用 setter 方法 (setName()) 为变量赋值,使用 getter 方法 (getName()) 访问变量。

我们在 setName() 中使用了 this 关键字来引用类的变量。要了解有关此关键字的更多信息,请访问Java this 关键字

注意:我们不能在 Java 中声明私有的类和接口。但是,嵌套类可以声明为私有。

protected 访问修饰符

当类的方法和数据成员声明为 protected 时,我们可以在同一个包中以及从子类中访问它们。例如,

public class Animal {
    // protected 方法
    protected void display() {
        System.out.println("我是动物");
    }
}

public class Dog extends Animal {
    public static void main(String[] args) {

        Dog dog = new Dog();
         // 调用 protected 方法
        dog.display();
    }
}

输出

我是动物

在上面的例子,我们有一个 Animal 类, Animal 有要一个 protected 方法 display()Dog 类继承了 Animal 类。

然后我们创建了一个 Dog 类的对象。我们尝试使用该对象访问父类的受保护方法。由于可以从子类访问父类的 protected 方法,因此代码可以正常执行,不会报错。

! 注意:我们不能声明 protected 类或接口。

要了解有关继承的更多信息,请访问Java 继承章节。

public 访问修饰符

当方法、变量、类等被声明为 public 时,我们就可以从任何地方访问它们。 public 访问修饰符没有范围限制。例如,

// 文件: Animal.java
public class Animal {
    // 公共属性
    public int legCount;

    // 公共方法
    public void display() {
        System.out.println("我时动物");
        System.out.println("我有 " + legCount + " 条腿。");
    }
}

// 文件:Main.java
public class Main {
    public static void main( String[] args ) {
        Animal animal = new Animal();

        // 访问公共属性
        animal.legCount = 4;
        // 访问公共方法
        animal.display();
    }
}

输出

我是动物。
我有 4 条腿。

在本例中:

  • Main 类可以访问公共的 Animal
  • Main 类可以访问 Animal 类的公共属性
  • Main 类可以访问 Animal 类的公共方法

为什么使用访问修饰符

到现在为止有一个问题,就是我们为什么要使用访问修饰符呢?

访问修饰符主要用于封装。可以控制自己的模块或者类被访问的范围,这样可以防止滥用数据,避免引入不必要的错误。另外可以隐藏模块或者类实现的细节,让程序使用/调用起来更容易。