橘子味的心
标题:Java访问修饰符

java中有两种类型的修饰符:访问修饰符和非修饰符。
java中的访问修饰符指定数据成员,方法,构造函数或类的辅助功能(范围)。
一共有4种类型的java访问修饰符:

  • private
  • default
  • protected
  • public

有许多非访问修饰符,如:static, abstract, synchronized, native, volatile, transient等修饰符。这里,我们将只学习访问修饰符。

private访问修饰符

私有(private)访问修饰符只能在类中访问。

private访问修饰符的简单示例

在这个例子中,我们创建了两个类:ASimple。 类包含私有数据成员和私有方法。 我们从类外访问这些私有成员,所以会产生编译时错误。

  1. class A {
  2. private int data = 40;
  3.  
  4. private void msg() {
  5. System.out.println("Hello java");
  6. }
  7. }
  8.  
  9. public class Simple {
  10. public static void main(String args[]) {
  11. A obj = new A();
  12. System.out.println(obj.data);// 私有变量,不可以从外部类中直接访问,因此有编译错误
  13. obj.msg();// 私有方法,不可以从外部类中直接访问,因此有编译错误
  14. }
  15. }
  16. Java

1. private访问修饰符

如果将类的构造函数声明为私有,则不能从类外部创建该类的实例。 例如:

  1. class A {
  2. private A() {
  3. }// private constructor
  4.  
  5. void msg() {
  6. System.out.println("Hello java");
  7. }
  8. }
  9.  
  10. public class Simple {
  11. public static void main(String args[]) {
  12. A obj = new A();// Compile Time Error
  13. }
  14. }
  15. Java

注意:类不能是私有或保护,除非是嵌套类。

2. default访问修饰符

如果不使用任何修饰符,默认情况下将其视为default修饰符。default修饰符只能在包内访问。

default访问修饰符示例

在这个例子中,我们创建了两个包packmypack。从它的包外部访问A类,因为一个类不是public的,所以它不能从包外部访问。如下两个类:A.javaB.java 代码。

  1. //save by A.java
  2. package pack;
  3. class A{
  4. void msg(){System.out.println("Hello");}
  5. }
  6. Java

B.java 代码的代码如下 -

  1. //save by B.java
  2. package mypack;
  3.  
  4. import pack.*;
  5.  
  6. class B {
  7. public static void main(String args[]) {
  8. A obj = new A();// Compile Time Error
  9. obj.msg();// Compile Time Error
  10. }
  11. }
  12. Java

在上面的例子中,A类的范围和它的方法msg()是默认(default)的,所以它不能从包外部访问。

3. protected访问修饰符

protected访问修饰符可以在包中和包外部访问,但只能通过继承。protected访问修饰符可以应用于数据成员,方法和构造函数。 它不能应用于类。

protected访问修饰符的示例

在这个例子中,我们创建了两个包packmypackA类的包是public的,所以可以从外部访问包。 但是这个包的msg方法声明为protected,因此只能通过继承从类外面访问它。如下两个类:A.javaB.java 代码。

  1. //save by A.java
  2. package pack;
  3.  
  4. public class A {
  5. protected void msg() {
  6. System.out.println("Hello");
  7. }
  8. }
  9. Java

B.java 代码如下 -

  1. //save by B.java
  2. package mypack;
  3.  
  4. import pack.*;
  5.  
  6. class B extends A {
  7. public static void main(String args[]) {
  8. B obj = new B();
  9. obj.msg();
  10. }
  11. }
  12. Java

执行上面代码,得到如下结果 -

4. public访问修饰符

公共(public)访问修饰符可随处访问。 它在所有其他修饰符中具有最广泛的范围。

public访问修饰符示例

如下两个类:A.javaB.java 代码。

A.java 的代码

  1. //save by A.java
  2.  
  3. package pack;
  4.  
  5. public class A {
  6. public void msg() {
  7. System.out.println("Hello");
  8. }
  9. }
  10. Java

B.java 的代码

  1. //save by B.java
  2.  
  3. package mypack;
  4.  
  5. import pack.*;
  6.  
  7. class B {
  8. public static void main(String args[]) {
  9. A obj = new A();
  10. obj.msg();
  11. }
  12. }
  13. Java

执行上面的代码,得到以下结果 -

理解所有java访问修饰符

让我们通过下面的一个简单的表来理解访问修饰符。

访问修饰符 在类内 在包内 外部包只通过子类 外部包
Private Y N N N
Default Y Y N N
Protected Y Y Y N
Public Y Y Y Y

如果你要覆盖任何方法,重写的方法(即在子类中声明)则不能声明得更严格。

  1. class A {
  2. protected void msg() {
  3. System.out.println("Hello java");
  4. }
  5. }
  6.  
  7. public class Simple extends A {
  8. void msg() {
  9. System.out.println("Hello java");
  10. }// C.T.Error
  11.  
  12. public static void main(String args[]) {
  13. Simple obj = new Simple();
  14. obj.msg();
  15. }
  16. }
  17. Java

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