Java存取修飾符


java中有兩種型別的修飾符:存取修飾符和非修飾符。
java中的存取修飾符指定資料成員,方法,建構函式或類的輔助功能(範圍)。
一共有4種型別的java存取修飾符:

  • private
  • default
  • protected
  • public

有許多非存取修飾符,如:static, abstract, synchronized, native, volatile, transient等修飾符。這裡,我們將只學習存取修飾符。

private存取修飾符

私有(private)存取修飾符只能在類中存取。

private存取修飾符的簡單範例

在這個例子中,我們建立了兩個類:ASimple。 類包含私有資料成員和私有方法。 我們從類外存取這些私有成員,所以會產生編譯時錯誤。

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);// 私有變數,不可以從外部類中直接存取,因此有編譯錯誤
        obj.msg();// 私有方法,不可以從外部類中直接存取,因此有編譯錯誤
    }
}

1. private存取修飾符

如果將類別建構函式宣告為私有,則不能從類外部建立該類的範例。 例如:

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. default存取修飾符

如果不使用任何修飾符,預設情況下將其視為default修飾符。default修飾符只能在包內存取。

default存取修飾符範例

在這個例子中,我們建立了兩個包packmypack。從它的包外部存取A類,因為一個類不是public的,所以它不能從包外部存取。如下兩個類:A.javaB.java 程式碼。

//save by A.java  
package pack;  
class A{  
    void msg(){System.out.println("Hello");}  
}

B.java 程式碼的程式碼如下 -

//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()是預設(default)的,所以它不能從包外部存取。

3. protected存取修飾符

protected存取修飾符可以在包中和包外部存取,但只能通過繼承。protected存取修飾符可以應用於資料成員,方法和建構函式。 它不能應用於類。

protected存取修飾符的範例

在這個例子中,我們建立了兩個包packmypackA類的包是public的,所以可以從外部存取包。 但是這個包的msg方法宣告為protected,因此只能通過繼承從類外面存取它。如下兩個類:A.javaB.java 程式碼。

//save by A.java  
package pack;

public class A {
    protected void msg() {
        System.out.println("Hello");
    }
}

B.java 程式碼如下 -

//save by B.java  
package mypack;

import pack.*;

class B extends A {
    public static void main(String args[]) {
        B obj = new B();
        obj.msg();
    }
}

執行上面程式碼,得到如下結果 -

Hello

4. public存取修飾符

公共(public)存取修飾符可隨處存取。 它在所有其他修飾符中具有最廣泛的範圍。

public存取修飾符範例

如下兩個類:A.javaB.java 程式碼。

A.java 的程式碼

//save by A.java  

package pack;

public class A {
    public void msg() {
        System.out.println("Hello");
    }
}

B.java 的程式碼

//save by B.java  

package mypack;

import pack.*;

class B {
    public static void main(String args[]) {
        A obj = new A();
        obj.msg();
    }
}

執行上面的程式碼,得到以下結果 -

Hello

理解所有java存取修飾符

讓我們通過下面的一個簡單的表來理解存取修飾符。

存取修飾符 在類內 在包內 外部包只通過子類 外部包
Private Y N N N
Default Y Y N N
Protected Y Y Y N
Public Y Y Y Y

如果你要覆蓋任何方法,重寫的方法(即在子類中宣告)則不能宣告得更嚴格。

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

預設(default)修飾符比受保護的修飾符更嚴格。 這就是為什麼有編譯時錯誤。