java中有兩種型別的修飾符:存取修飾符和非修飾符。
java中的存取修飾符指定資料成員,方法,建構函式或類的輔助功能(範圍)。
一共有4
種型別的java存取修飾符:
private
default
protected
public
有許多非存取修飾符,如:static
, abstract
, synchronized
, native
, volatile
, transient
等修飾符。這裡,我們將只學習存取修飾符。
私有(private
)存取修飾符只能在類中存取。
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);// 私有變數,不可以從外部類中直接存取,因此有編譯錯誤
obj.msg();// 私有方法,不可以從外部類中直接存取,因此有編譯錯誤
}
}
如果將類別建構函式宣告為私有,則不能從類外部建立該類的範例。 例如:
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
}
}
注意:類不能是私有或保護,除非是巢狀類。
如果不使用任何修飾符,預設情況下將其視為default
修飾符。default
修飾符只能在包內存取。
default存取修飾符範例
在這個例子中,我們建立了兩個包pack
和mypack
。從它的包外部存取A
類,因為一個類不是public
的,所以它不能從包外部存取。如下兩個類:A.java
和 B.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
)的,所以它不能從包外部存取。
protected
存取修飾符可以在包中和包外部存取,但只能通過繼承。protected
存取修飾符可以應用於資料成員,方法和建構函式。 它不能應用於類。
protected存取修飾符的範例
在這個例子中,我們建立了兩個包pack
和mypack
。 A
類的包是public
的,所以可以從外部存取包。 但是這個包的msg
方法宣告為protected
,因此只能通過繼承從類外面存取它。如下兩個類:A.java
和 B.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
公共(public
)存取修飾符可隨處存取。 它在所有其他修飾符中具有最廣泛的範圍。
public存取修飾符範例
如下兩個類:A.java
和 B.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
讓我們通過下面的一個簡單的表來理解存取修飾符。
存取修飾符 | 在類內 | 在包內 | 外部包只通過子類 | 外部包 |
---|---|---|---|---|
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
)修飾符比受保護的修飾符更嚴格。 這就是為什麼有編譯時錯誤。