Java public vs protected vs package vs private访问修饰符
Java具有多种级别的保护,可以精确控制类、子类和包内成员变量和方法的可访问性。访问控制机制依赖于public、protected、private和package等访问修饰符。它们定义了变量、类和方法的范围。我们将了解Java中的各种访问修饰符。
Java中的访问修饰符
public访问修饰符
Java不限制public成员的访问性。任何声明为public的内容都可以在任何地方访问,意味着我们可以在类内部和类外部以及包内部和包外部访问它们。你可能注意到Java中的main()方法总是被定义为public,以便存在于当前程序范围之外的JVM可以调用它。
public访问修饰符的几个示例:
public int i1 = 108;
public double d2 = 6.55;
这里,变量被声明为public。
private修饰符
当我们将一个类成员声明为私有时,它对于其类外部的任何代码,包括其子类,都是不可访问的。我们可以通过使用private关键字来实现更高级别的封装。
私有访问修饰符的几个示例−
private int mobNo = 982266;
private double income = 35005.55;
这里,变量被声明为私有的。
protected 访问修饰符
它在继承的情况下主要用于控制父类成员和相应子类成员的访问。它允许一个元素在当前包之外被访问,但只能被直接的类的子类访问。这里,包是容纳一组类的容器。
受保护访问修饰符的一些示例 –
protected int data1 = 5;
protected double data2 = 5.55;
在这里,变量声明为protected。
package 访问修饰符
它也被称为默认访问修饰符。当我们没有显式地给类和方法指定访问修饰符时,Java编译器会自动将其视为默认或包成员。我们可以在子类和同一个包内的其他类中访问这些成员。
包访问修饰符的几个示例 −
int i1 = 108;
double d2 = 6.55;
在这里,变量可以声明为默认或包级别。
public vs protected vs package vs private访问修饰符
从上面的讨论中,我们可以得出以下这些访问修饰符之间的区别:
可访问区域 | public | protected | package | private |
---|---|---|---|---|
同一类内部 | 是 | 是 | 是 | 是 |
同一包的子类内部 | 是 | 是 | 是 | 否 |
同一包的非子类内部 | 是 | 是 | 是 | 否 |
其他包的子类内部 | 是 | 是 | 否 | 否 |
其他包的非子类内部 | 是 | 否 | 否 | 否 |
在上述表中,“是”代表具有指定访问修饰符的成员对于给定区域是可访问的,“否”代表不可访问。 |
示例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
在这里,我们修改了前一个示例的代码,由于我们尝试在子类中访问私有方法,所以出现了编译时错误。
结论
访问修饰符确定类或方法的成员如何被访问。它们在声明时附加到成员上。在本文中,我们详细解释了所有访问修饰符,并且提供了相应的示例,并且还讨论了其中的一些区别。