Java 中的 private、protected 和 final 访问修饰符


每当我们声明一个类时,都需要提供它的访问级别,以便 JVM 可以知道程序中是否可以发生继承或实例化,以及类的作用域是什么。为此,我们使用访问修饰符,这些修饰符可以用于类、方法和变量等。

  • private 访问修饰符将方法或变量的访问限制在类内;这意味着只能在同一个类中访问该方法或变量。

  • protected 访问修饰符允许访问该类及其任何子类,包括其他包中的类。

  • final 访问修饰符不允许扩展类。如果应用于方法,则子类不能覆盖它。如果声明一个变量为 final,则在初始化后不能对其重新赋值。

算法

要实现 private、protected 和 final 访问修饰符,请按照以下步骤操作:

  • 步骤 1 − 定义一个类及其成员,即方法和变量。

  • 步骤 2 − 要将变量或方法声明为 private,请使用 private 关键字作为访问修饰符。

  • 步骤 3 − 要将变量或方法声明为 protected,请使用 protected 关键字作为访问修饰符。

  • 步骤 4 − 使用 final 关键字定义变量为 final。

  • 步骤 5 − 现在,同一个类的成员可以访问 private 变量或方法。

  • 步骤 6 − 同一个类或子类的方法可以访问 protected 变量或方法。

  • 步骤 7 − 要在类外部访问 private 和 protected 变量,可以使用访问这些变量的 public 方法。

  • 步骤 8 − 访问 private 和 protected 变量的方法应声明为 public。

  • 步骤 9 − 要创建可在类内访问的常量,请同时使用 private 和 final 关键字。

  • 步骤 10 − 要创建可在类和子类中访问的常量,请同时使用 protected 和 final 关键字。

语法

public class Way2Class {
   private int privateVariable;
   protected int protectedVariable;
   final int finalVariable = 5;

   private void privateMethod() {
      // method implementation
   }

   protected void protectedMethod() {
      // method implementation
   }
}

方法 1:使用 private 访问修饰符

代码片段如下

示例

public class Main {
   private String name;
   private int age;

   public Main(String name, int age) {
      this.name = name;
      this.age = age;
   }

   private String getDetails() {
      return "Name: " + name + ", Age: " + age;
   }

   public void displayDetails() {
      String details = getDetails();
      System.out.println(details);
   }

   public static void main(String[] args) {
      Main john = new Main("John", 30);
      john.displayDetails(); // prints "Name: John, Age: 30"
      String details = john.getDetails(); // Accessing private method, results in a compile-time error
      String name = john.name; // Accessing private field, results in a compile-time error
      int age = john.age; // Accessing private field, results in a compile-time error
   }
}

输出

Name: John, Age: 30

解释

在上面的程序中,如果我们在 Employee 类外部调用 getDetails() 方法和 private 变量,则会得到编译时错误。

方法 2:使用 protected 访问修饰符

代码示例如下

示例

public class Main {
   public static void main(String[] args) {
      Car honda = new Car("Honda", "Civic", 2022, 4);
      honda.displayDetails();
   }
}

class Vehicle {
   protected String make;
   protected String model;
   protected int year;

   public Vehicle(String make, String model, int year) {
      this.make = make;
      this.model = model;
      this.year = year;
   }

   protected String getDetails() {
      return "Make: " + make + ", Model: " + model + ", Year: " + year;
   }
}

class Car extends Vehicle {
   private int numDoors;

   public Car(String make, String model, int year, int numDoors) {
      super(make, model, year);
      this.numDoors = numDoors;
   }

   public void displayDetails() {
      String details = getDetails() + ", Number of Doors: " + numDoors;
      System.out.println(details);
   }
}

输出

Make: Honda, Model: Civic, Year: 2022, Number of Doors: 4

解释

以下代码执行没有错误,因为我们在同一个包、类和子类中访问 protected 变量和方法。

方法 3:使用 final 访问修饰符

示例

class Animal {
   final String species;

   public Animal(String species) {
      this.species = species;
   }

   public void makeSound() {
      System.out.println("The " + species + " makes a sound.");
   }
}

class Cat extends Animal {
   public Cat() {
      super("Cat");
   }

   @Override
   public void makeSound() {
      System.out.println("Meow!");
   }
}

public class Main {
   public static void main(String[] args) {
      Cat cat = new Cat();
      cat.makeSound();
   }
}

输出

Meow!

解释

Cat 类扩展 Animal 类,并且不添加任何新的实例变量,但是它试图用自己的实现覆盖 makeSound() 方法,该实现只是打印出“Mawo!”。但是,由于 Animal 类中的 makeSound() 方法被标记为 final,因此此尝试会导致编译时错误。

不同方法的比较

Private 修饰符

Protected 修饰符

Final 修饰符

成员可以在声明它们的同一个类中访问。

成员可以在同一个包中的类和子类中访问。

成员不能在同一个类或子类中访问。

接口可以使用此修饰符

接口可以使用此修饰符

接口不能使用此修饰符

Private 方法可以被覆盖

Protected 方法不能被覆盖

Final 方法不能被覆盖。

结论

Java 中的这些访问修饰符用于控制类成员(变量、方法和内部类)的可见性。Private 将访问限制在同一个类中,protected 允许访问子类和同一个包中的类,final 表示成员的值不能更改或方法不能被覆盖。

更新于:2023年8月1日

492 次浏览

启动您的职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.