Java基礎:第三十五講 存取權限

來源:互聯網
上載者:User

 

    存取權限指的是是否運行訪問類以及類的成員,通過存取控制符來實現,包括類的存取控制符和成員的存取控制符。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.