存取權限指的是是否運行訪問類以及類的成員,通過存取控制符來實現,包括類的存取控制符和成員的存取控制符。
1、類的存取控制符
類的存取控制符包括public和預設的。
public存取控制符:
public class Person{
...
}
預設的存取控制符:
class Person(){
...
}
public修飾的類可以在任何地方訪問,而預設的存取控制符只運行同一個包中使用。看下面的代碼:
----------------源檔案:A.java-------------------------
package ch11;
public class A{
...
}
----------------源檔案:B.java-------------------------
package ch11;
class B{
...
}
----------------源檔案:Test.java-------------------------
package ch11;
public class Test{
public static void main(String[] args){
A a = new A(); // 正確,public運行訪問
B b = new B(); // 正確,同一個包允許訪問
}
}
----------------源檔案:ch12包下的Test.java-------------------------
package ch12;
import ch11.A;
import ch11.B; // 錯誤,不同包不能訪問
public class Test{
public static void main(String[] args){
A a = new A(); // 正確
B b = new B(); // 錯誤,不同包不能訪問
}
}
通常類的存取控制符都寫成public,如果你希望對他的訪問進行限制,可以使用預設的存取控制符。
2、訪問類型劃分
在我們討論存取權限的時候,我們會說允許外部類訪問,允許子類訪問,允許同包中的類訪問等等,這些訪問是什麼意思呢?這既是訪問類型,只有理解了這些訪問類型,才能理解存取權限。
首先我們要清楚訪問發生在什麼地方,訪問實際上是對某個對象(有時候會是類)的成員的訪問,這些訪問的代碼肯定是在某個方法中。訪問類型實際上是要訪問的代碼與被訪問的代碼所在位置的關係。下面對這些訪問類型進行分析。
下面的例子展示了4中訪問類型:
package ch11;
public class A{
public String id;
public String getId(){
return id; // 在類內部訪問成員變數id,實際上是類自己的方法
}
}
package ch11;
public class B{
public String getInf(A a){
return a.id; // 同包中的類B中的方法訪問類A的成員
}
}
package ch11;
public class C extends A{
public String getId(){
return id; // 子類直接調用父類的方法或者屬性
}
}
package ch12;
public class D{
public String getInf(A a){
return a.id; // 不同包中的類D中的方法訪問類A的成員
}
}
3、成員的存取控制符
成員的存取控制符有4種:public 預設的 protected 和private。
如果存取控制符是public,則上賣弄的4種情況都可以。
如果存取控制符是預設的,則第一種情況可以,同包的情況也可以。
如果存取控制符是protected,第一種情況可以,子類的情況也可以。
如果存取控制符是private,則只有第一種情況可以。
下面的表格是顯示了具體的訪問是否允許的情況:
| |
類自身 |
子類 |
同包 |
不同包非子類 |
| public |
OK |
OK |
OK |
OK |
| 預設的 |
OK |
同包OK |
OK |
|
| protected |
OK |
OK |
OK |
|
| private |
OK |
|
|
|
下面的例子展示了各種情況:
package ch11; public class A { public
int i_public; protected
int i_protected;
int i_default; private
int i_private; // 類自己的方法,可以訪問所有類型的成員變數 public void f(){ i_public = 10; i_protected = 20; i_default = 30; i_private = 40; }} package ch11; public class B_same_package { // 同包不能訪問private public void f(A a){ a.i_public = 10; a.i_default = 20; a.i_protected = 30; }} package ch11; public class Child_same_package extends A{ // 同包子類不可以訪問private成員 public void f(){ i_public = 10; i_protected = 20; i_default = 30; }} package ch12;import ch11.A;public class B_different_package { // 不同包只能訪問public public void f(A a){ a.i_public = 10; }} package ch12;import ch11.A;;public class Child_different_package extends A{ // 不同包子類可以訪問public和protected成員 public void f(){ i_public = 10; i_protected = 20; }}
下一次介紹成員變數的繼承。
上一次:第三十四講 包 下一次:第三十六講 成員變數的繼承與覆蓋李緒成 CSDN Blog:http://blog.csdn.net/javaeeteacher邀請您為好友:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5