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
这里我们修改了前面示例的代码,我们得到了一个编译时错误,因为我们试图在子类中访问一个私有方法。
结论
访问修饰符决定了如何访问类的成员或方法。它们在声明时附加到成员上。在本文中,我们详细解释了所有访问修饰符,并分别提供了示例,还讨论了它们之间的一些差异。