📅  最后修改于: 2020-09-25 14:47:04             🧑  作者: Mango
Java中有两种类型的修饰符:访问修饰符和非访问修饰符。
Java中的访问修饰符指定字段,方法,构造函数或类的可访问性或范围。我们可以通过在其上应用访问修饰符来更改字段,构造函数,方法和类的访问级别。
Java访问修饰符有四种类型:
有许多非访问修饰符,例如静态,抽象,同步,本机,易失,瞬态等。在这里,我们将仅学习访问修饰符。
让我们通过一个简单的表来了解Java中的访问修饰符。
Access Modifier | within class | within package | outside package by subclass only | outside package |
---|---|---|---|---|
Private | Y | N | N | N |
Default | Y | Y | N | N |
Protected | Y | Y | Y | N |
Public | Y | Y | Y | Y |
专用访问修饰符仅在该类中可访问。
私有访问修饰符的简单示例
在此示例中,我们创建了两个类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 constructor
void msg(){System.out.println("Hello java");}
}
public class Simple{
public static void main(String args[]){
A obj=new A();//Compile Time Error
}
}
注意:除嵌套类外,其他类不能为私有类或受保护类。
如果您不使用任何修饰符,则默认情况下会将其视为默认修饰符。默认修饰符只能在包中访问。不能从软件包外部访问它。它提供了比私有更多的可访问性。但是,它比受保护的和公开的更具限制性。
默认访问修饰符的示例
在此示例中,我们创建了两个软件包pack和mypack。由于A类不是公共的,因此我们无法从其包外部访问A类,因此无法从包外部对其进行访问。
//save by A.java
package pack;
class A{
void msg(){System.out.println("Hello");}
}
//save by B.java
package 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()是默认的,因此无法从程序包外部对其进行访问。
受保护的访问修饰符可在包内和包外访问,但只能通过继承访问。
受保护的访问修饰符可以应用于数据成员,方法和构造函数。它不能应用于课程。
它提供了比默认修饰符更多的可访问性。
受保护的访问修饰符的示例
在此示例中,我们创建了两个软件包pack和mypack。A类包软件包是公共的,因此可以从包外部进行访问。但是此包的msg方法被声明为protected,因此只能通过继承从类外部访问它。
//save by A.java
package pack;
public class A{
protected void msg(){System.out.println("Hello");}
}
//save by B.java
package mypack;
import pack.*;
class B extends A{
public static void main(String args[]){
B obj = new B();
obj.msg();
}
}
公共访问修饰符随处可见。在所有其他修饰符中,它的作用范围最广。
公共访问修饰符示例
//save by A.java
package pack;
public class A{
public void msg(){System.out.println("Hello");}
}
//save by B.java
package mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();
obj.msg();
}
}
如果要覆盖任何方法,则被覆盖的方法(即在子类中声明的方法)必须没有更多限制。
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();
}
}
默认修饰符比受保护的更严格。这就是为什么存在编译时错误。