我們可以控制類成員變量和方法的訪問級別通過訪問說明符。
Java的訪問說明符是public,private,protected和默認(rèn)訪問級別。
受保護(hù)的功能比默認(rèn)功能更容易訪問。
要了解公共和私人訪問的影響,請考慮以下程序:
class Test { int a; // default access public int b; // public access private int c; // private access // methods to access c void setc(int i) { c = i; } int getc() { return c; } } public class Main { public static void main(String args[]) { Test ob = new Test(); ob.a = 1; ob.b = 2; // This is not OK and will cause an error // ob.c = 100; // Error! // You must access c through its methods ob.setc(100); // OK System.out.println("a, b, and c: " + ob.a + " " + ob.b + " " + ob.getc()); } }
輸出:
子類不能訪問超類的私有成員。例如,考慮下面的簡單類層次結(jié)構(gòu)。如果嘗試編譯以下程序,您將收到錯(cuò)誤消息。
class A { private int j; // private to A } class B extends A { int total; void sum() { total = j; // ERROR, j is not accessible here } }
輸出:
下表顯示了Java的訪問矩陣。是意味著無障礙,沒有意義無法訪問。
位置 | 私人的 | 無修飾符 | 保護(hù) | 公開 |
---|---|---|---|---|
相同類 | Yes | Yes | Yes | Yes |
相同的包子類 | No | Yes | Yes | Yes |
相同的包非子類 | No | Yes | Yes | Yes |
不同的包子類 | No | No | Yes | Yes |
不同的包非子類 | No | No | No | Yes |
并非所有修改器都可以應(yīng)用于所有功能。頂級類可能不受保護(hù)。方法可能不是短暫的。靜態(tài)可以將其應(yīng)用于自由浮動代碼塊。
下表顯示了功能和修改器的所有可能組合。yes表示我們可以使用該修飾符來控制對應(yīng)實(shí)體的訪問。
修飾符 | 類 | 變量 | 方法 | 構(gòu)造函數(shù) | 代碼塊 |
---|---|---|---|---|---|
public | yes | yes | yes | yes | no |
protected | no | yes | yes | yes | no |
empty accessor | yes | yes | yes | yes | yes |
private | no | yes | yes | yes | no |
final | yes | yes | yes | no | no |
abstract | yes | no | yes | no | no |
static | no | yes | yes | no | yes |
native | no | no | yes | no | no |
transient | no | yes | no | no | no |
volatile | no | yes | no | no | no |
synchronized | no | no | yes | no | yes |
更多建議: