📜  Java 访问修饰符

📅  最后修改于: 2020-09-25 14:47:04             🧑  作者: Mango

Java中的访问修饰符

Java中有两种类型的修饰符:访问修饰符和非访问修饰符。

Java中的访问修饰符指定字段,方法,构造函数或类的可访问性或范围。我们可以通过在其上应用访问修饰符来更改字段,构造函数,方法和类的访问级别。

Java访问修饰符有四种类型:

  • 私有 :私有修饰符的访问级别仅在该类之内。不能从班级外部访问它。
  • 默认值 :默认修饰符的访问级别仅在包中。不能从软件包外部访问它。如果您未指定任何访问级别,它将是默认值。
  • 受保护的 :受保护的修饰符的访问级别通过子类在包内和包外。如果不创建子类,则无法从包外部对其进行访问。
  • Public :公共修饰符的访问级别无处不在。可以从类内部,类外部,包内部和包外部访问它。

有许多非访问修饰符,例如静态,抽象,同步,本机,易失,瞬态等。在这里,我们将仅学习访问修饰符。

了解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

1)私人的

专用访问修饰符仅在该类中可访问。

私有访问修饰符的简单示例

在此示例中,我们创建了两个类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  
 }  
}  

注意:除嵌套类外,其他类不能为私有类或受保护类。

2)默认

如果您不使用任何修饰符,则默认情况下会将其视为默认修饰符。默认修饰符只能在包中访问。不能从软件包外部访问它。它提供了比私有更多的可访问性。但是,它比受保护的和公开的更具限制性。

默认访问修饰符的示例

在此示例中,我们创建了两个软件包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()是默认的,因此无法从程序包外部对其进行访问。

3)受保护

受保护的访问修饰符可在包内和包外访问,但只能通过继承访问。

受保护的访问修饰符可以应用于数据成员,方法和构造函数。它不能应用于课程。

它提供了比默认修饰符更多的可访问性。

受保护的访问修饰符的示例

在此示例中,我们创建了两个软件包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();  
  }  
}  

4)公开

公共访问修饰符随处可见。在所有其他修饰符中,它的作用范围最广。

公共访问修饰符示例

//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();  
  }  
}  

具有方法覆盖的Java Access修饰符

如果要覆盖任何方法,则被覆盖的方法(即在子类中声明的方法)必须没有更多限制。

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();  
   }  
}  

默认修饰符比受保护的更严格。这就是为什么存在编译时错误。