Java 中的公共、受保护、包和私有访问修饰符


Java 提供了不同级别的保护,允许精确控制类、子类和包中成员变量和方法的可访问性。访问控制机制借助于访问修饰符(如 public、protected、private 和 package)来实现。它们定义了变量、类和方法的作用域。我们将了解 Java 中的各种访问修饰符。

Java 中的访问修饰符

公共访问修饰符

Java 不会限制公共成员的可访问性。任何声明为 public 的内容都可以在任何地方访问,这意味着我们可以在类内部和外部访问它们,以及在包内和外部访问它们。您可能已经注意到,Java 中的 main() 方法始终定义为 public,以便存在于当前程序任何作用域之外的 JVM 可以调用它。

公共访问修饰符的一些示例:

public int i1 = 108;
public double d2 = 6.55;

这里,变量被声明为 public。

私有访问修饰符

当我们将类成员声明为 private 时,它将无法被其类外部的任何代码访问,包括其子类。通过使用 private 关键字,我们可以实现更高层次的封装。

私有访问修饰符的一些示例:

private int mobNo = 982266;
private double income = 35005.55;

这里,变量被声明为 private。

受保护访问修饰符

它主要用于继承的情况下,以控制父类成员和相应子类成员的访问。它允许在当前包之外访问元素,但仅限于类的直接子类。这里,包是包含一组类的容器。

受保护访问修饰符的一些示例:

protected int data1 = 5;
protected double data2 = 5.55;

这里,变量被声明为 protected。

包访问修饰符

它也称为默认访问修饰符。当我们没有显式地为类和方法指定任何访问说明符时,Java 编译器会自动将其视为默认或包成员。我们可以在同一个包中的子类以及其他类内部访问这些成员。

包访问修饰符的一些示例:

int i1 = 108;
double d2 = 6.55;

这里,变量被声明为 default 或 package。

公共、受保护、包和私有访问修饰符

从以上讨论中,我们可以得出以下关于这些访问修饰符之间差异的结论:

可访问区域

公共

受保护

私有

在同一类中

在同一包的子类中

在同一包的非子类中

其他包的子类

其他包的非子类

在上表中,“是”表示具有指定访问修饰符的成员可访问给定区域,“否”表示不可访问。

示例 1

以下示例说明了在 Java 中使用 public、protected 和 package 修饰符。

class Pack {  
   protected void prnt1() { 
      // method declared as protected
      String msg1 = "I am accessing a protected method";
      System.out.println(msg1);
   }
   public void prnt2() { 
      // method declared as public 
      String msg2 = "I am inside a public method";
      System.out.println(msg2);
   }
   void prnt3() { 
      // method declared as default 
      String msg3 = "I am inside a default method";
      System.out.println(msg3);
   }
}
public class ClassShow extends Pack {  
   public static void main(String args[]) { 
      // object of sub class
      ClassShow obj = new ClassShow();  
      // method calling through object of sub class
      obj.prnt1();  
      obj.prnt2();  
      obj.prnt3();  
   }
}

输出

I am accessing a protected method
I am inside a public method
I am inside a default method

示例 2

以下示例说明了如果我们在 Java 中将方法声明为 private 会发生什么。

class Pack {  
   private void prnt() {
      // declaring a method private
      String msg = "I am inside a private method";
      System.out.print(msg);
   }
}
public class ClassShow extends Pack {  
   public static void main(String args[]) { 
      // object of child class
      ClassShow obj = new ClassShow();  
      // method calling through object of child class
      obj.prnt();
   }  
}  

输出

ClassShow.java:13: error: cannot find symbol
      obj.prnt();
         ^
  symbol:   method prnt()
  location: variable obj of type ClassShow
1 error

这里我们修改了前面示例的代码,我们得到了一个编译时错误,因为我们试图在子类中访问一个私有方法。

结论

访问修饰符决定了如何访问类的成员或方法。它们在声明时附加到成员上。在本文中,我们详细解释了所有访问修饰符,并分别提供了示例,还讨论了它们之间的一些差异。

更新于: 2023年5月16日

460 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告