Java 私有、受保护和最终访问修饰符

Java 私有、受保护和最终访问修饰符

每当我们声明一个类时,我们需要提供其访问级别,以便JVM知道程序中是否可以进行继承或实例化,并且类的范围是什么。为此,我们使用访问修饰符,这些修饰符可以与类、方法和变量等一起使用。

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

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

  • 最终访问修饰符不允许类被扩展。如果应用于方法,则该方法不能被子类覆盖。如果变量被声明为final,则在初始化之后不能再被赋值。

步骤

要实现私有、受保护和最终访问修饰符,请按照以下步骤进行:

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

  • 步骤2 - 使用private关键字作为访问修饰符将变量或方法声明为私有。

  • 步骤3 - 使用protected关键字作为访问修饰符将变量或方法声明为受保护。

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

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

  • 步骤6 - 同一个类或其子类的方法可以访问受保护的变量或方法。

  • 步骤7 - 要在类外部访问私有和受保护的变量,可以使用访问这些变量的公共方法。

  • 步骤8 - 访问私有和受保护变量的方法应该声明为公共的。

  • 步骤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()方法和私有变量,则会得到编译时错误。

方法2:使用受保护的访问修饰符

下面是一个代码示例

示例

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

解释

以下代码不会出现任何错误,因为我们在同一个包、类和子类中访问了受保护的变量和方法。

方法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,所以这个尝试导致了编译时错误。

方法比较

私有修饰符 受保护的修饰符 最终修饰符
成员在声明的同一类中可以被访问。 在同一包中的类和子类中可以访问成员。 成员不能在同一类或子类中访问。
接口可以使用此修饰符。 接口可以使用此修饰符。 接口不能使用此修饰符。
私有方法可以被重写。 受保护的方法不能被重写。 最终方法不能被重写。

结论

Java中的这些访问修饰符用于控制类的成员(变量、方法和内部类)的可见性。私有(private)限制只允许同类中的成员访问,受保护(protected)允许子类和同一包中的类访问,而final表示成员的值不能被修改,方法不能被重写。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程