java中有兩種類型的修飾符:訪問修飾符和非修飾符。
java中的訪問修飾符指定數(shù)據(jù)成員,方法,構(gòu)造函數(shù)或類的輔助功能(范圍)。
一共有4種類型的java訪問修飾符:
privatedefaultprotectedpublic有許多非訪問修飾符,如:static, abstract, synchronized, native, volatile, transient等修飾符。這里,我們將只學(xué)習(xí)訪問修飾符。
私有(private)訪問修飾符只能在類中訪問。
private訪問修飾符的簡(jiǎn)單示例
在這個(gè)例子中,我們創(chuàng)建了兩個(gè)類:A和Simple。 類包含私有數(shù)據(jù)成員和私有方法。 我們從類外訪問這些私有成員,所以會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤。
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);// 私有變量,不可以從外部類中直接訪問,因此有編譯錯(cuò)誤
obj.msg();// 私有方法,不可以從外部類中直接訪問,因此有編譯錯(cuò)誤
}
}
如果將類的構(gòu)造函數(shù)聲明為私有,則不能從類外部創(chuàng)建該類的實(shí)例。 例如:
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
}
}
注意:類不能是私有或保護(hù),除非是嵌套類。
如果不使用任何修飾符,默認(rèn)情況下將其視為default修飾符。default修飾符只能在包內(nèi)訪問。
default訪問修飾符示例
在這個(gè)例子中,我們創(chuàng)建了兩個(gè)包pack和mypack。從它的包外部訪問A類,因?yàn)橐粋€(gè)類不是public的,所以它不能從包外部訪問。如下兩個(gè)類: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()是默認(rèn)(default)的,所以它不能從包外部訪問。
protected訪問修飾符可以在包中和包外部訪問,但只能通過繼承。protected訪問修飾符可以應(yīng)用于數(shù)據(jù)成員,方法和構(gòu)造函數(shù)。 它不能應(yīng)用于類。
protected訪問修飾符的示例
在這個(gè)例子中,我們創(chuàng)建了兩個(gè)包pack和mypack。 A類的包是public的,所以可以從外部訪問包。 但是這個(gè)包的msg方法聲明為protected,因此只能通過繼承從類外面訪問它。如下兩個(gè)類: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();
}
}
執(zhí)行上面代碼,得到如下結(jié)果 -
Hello
公共(public)訪問修飾符可隨處訪問。 它在所有其他修飾符中具有最廣泛的范圍。
public訪問修飾符示例
如下兩個(gè)類: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();
}
}
執(zhí)行上面的代碼,得到以下結(jié)果 -
Hello
讓我們通過下面的一個(gè)簡(jiǎn)單的表來理解訪問修飾符。
| 訪問修飾符 | 在類內(nèi) | 在包內(nèi) | 外部包只通過子類 | 外部包 |
|---|---|---|---|---|
| Private | Y | N | N | N |
| Default | Y | Y | N | N |
| Protected | Y | Y | Y | N |
| Public | Y | Y | Y | Y |
如果你要覆蓋任何方法,重寫的方法(即在子類中聲明)則不能聲明得更嚴(yán)格。
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();
}
}
默認(rèn)(default)修飾符比受保護(hù)的修飾符更嚴(yán)格。 這就是為什么有編譯時(shí)錯(cuò)誤。