Java 访问修饰符
Java中的修饰符有两种:
访问修饰符和
非访问修饰符。
Java中的访问修饰符指定字段,方法,构造函数或类的可访问性或范围。我们可以通过在其上应用访问修饰符来更改字段,构造函数,方法和类的访问级别。
Java访问修饰符有四种类型:
Private: 私有修饰符的访问级别仅在该类之内。不能从班级外部访问它。
Default: 默认修饰符的访问级别仅在包中。不能从软件包外部访问它。如果您未指定任何访问级别,它将是默认级别。
Protected: 受保护的修饰符的访问级别通过子类在程序包内和程序包外。如果您不创建子类,则无法从包外部对其进行访问。
Public: 公共修改器的访问级别无处不在。可以从类内部,类外部,包内部和包外部对其进行访问。
有许多非访问修饰符,例如 static, abstract, synchronized, native, volatile等。在这里,我们将仅学习访问修饰符。
了解Java访问修饰符
让我们通过一个简单的表来了解Java中的访问修饰符。
访问修饰符 |
class中 |
package中 |
子类package外 |
package外 |
Private |
Y |
N |
N |
N |
Default |
Y |
Y |
N |
N |
Protected |
Y |
Y |
Y |
N |
Public |
Y |
Y |
Y |
Y |
1)Private
私有访问修饰符只能在该类中访问。
私有访问修饰符的简单示例
在此示例中,我们创建了两个类A和Simple。一个类包含私有数据成员和私有方法。我们正在从类外部访问这些私有成员,因此会出现编译时错误。
class A{
private int data=40;
private void msg(){
System.out.println("Hello java");
}
}
public class Simple{
public static void main(String args[]){
A obj=new A();
System.out.println(obj.data);
//Compile Time Error obj.msg();
//Compile Time Error }
}
私有构造函数的作用
如果将任何类构造函数设为私有,则无法从外部创建该类的实例班级。例如:
class A{
private A(){
}
//private constructorvoid msg(){
System.out.println("Hello java");
}
}
public class Simple{
public static void main(String args[]){
A obj=new A();
//Compile Time Error }
}
注意: 除嵌套类外,其他类不能是私有的或受保护的。
2)Default
如果您不使用任何修饰符,则将其视为
默认值。默认修饰符只能在包中访问。不能从软件包外部访问它。它提供了比私有更多的可访问性。但是,它比受保护的和公开的更具限制性。
默认访问修饰符的示例
在此示例中,我们创建了两个包pack和mypack。我们正在从其包的外部访问A类,因为A类不是公共的,因此无法从包的外部对其进行访问。
//save by A.javapackage pack;
class A{
void msg(){
System.out.println("Hello");
}
}
//save by B.javapackage mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();
//Compile Time Error obj.msg();
//Compile Time Error }
}
在上面的示例中,类A的范围及其方法msg()是默认的,因此无法从程序包外部对其进行访问。
3)Protected
受保护的访问修饰符可以在程序包内和外部访问包,但仅通过继承。
受保护的访问修饰符可以应用于数据成员,方法和构造函数。它不能应用于课程。
它提供了比默认修饰符更多的可访问性。
受保护的访问修饰符示例
在此示例中,我们创建了两个包pack和mypack。 A类包软件包是公共的,因此可以从包外部进行访问。但是该程序包的msg方法被声明为受保护的,因此只能通过继承从类外部访问它。
//save by A.javapackage pack;
public class A{
protected void msg(){
System.out.println("Hello");
}
}
//save by B.javapackage mypack;
import pack.*;
class B extends A{
public static void main(String args[]){
B obj = new B();
obj.msg();
}
}
4)Public
公共访问修饰符随处可见。在所有其他修饰符中,它具有最广泛的范围。
公共访问修饰符示例
//save by A.javapackage pack;
public class A{
public void msg(){
System.out.println("Hello");
}
}
//save by B.javapackage mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();
obj.msg();
}
}
具有方法覆盖的Java访问修饰符
如果要覆盖任何方法,则覆盖方法(即在子类中声明的方法) )的限制不得更多。
class A{
protected void msg(){
System.out.println("Hello java");
}
}
public class Simple extends A{
void msg(){
System.out.println("Hello java");
}
//C.T.Error public static void main(String args[]){
Simple obj=new Simple();
obj.msg();
}
}
默认修饰符的限制比受保护的限制更大。这就是为什么存在编译时错误。