Java存取層級修飾符

來源:互聯網
上載者:User

存取層級修飾符決定其他類是否可以訪問該類的某個欄位或某個方法。

有兩種存取控制種類;

1.Top Level(針對類的修飾)

包括public和package-private(不明確指定修飾符,什麼都不寫,即預設情況)兩種修飾符;

2.Member Level(針對成員的修飾)

包括public,private,protect,package-private四種修飾符。

 

對於類的存取控制,public表示被修飾的類對任何地方的類都可見。如果不寫存取修飾詞,即package-private情況,被修飾類只對該類所屬包的類可見。

對於成員的存取控制,public和package-private的定義和類的存取控制完全一樣,成員新增了兩個存取修飾詞分別是private和protect,private表示該成員只能被所屬的類訪問,protect包括了package-private的可見度,多出了對該類子類的可見度,子類可以在該類的同一個包,也可以在其他包。

JAVA的存取控制看上去還是很簡單,但有一點我覺得有點迷惑,就是如果一個類的存取修飾詞為package-private(不明確指定修飾符),那麼該類的成員比如一個方法的修飾符定義為public有什麼意義?因為該類在別的包都不能訪問了,那該類的方法肯定也就無法調用了。但是這樣定義程式並不報錯,因此肯定有其存在的道理。在網上搜尋了一下類似的疑問,發現了一個很好例子可以解釋這個疑問。

代碼package test;   
public abstract class Test {   
    public abstract void test();   
    public static Test getInstance(){   
        return new SubTest();   
    }   
}   
class SubTest extends Test{   
    @Override  
    public void test() {   
        System.out.println("SubTest's test()");   
    }   
}   
測試用代碼:   
import test.Test;   
public class Main {   
    public static void main(String[] args) {   
        Test t = Test.getInstance();   
        t.test();   
    }   
}  

 

 這是現在我知道的唯一一種可以讓package-private修飾的類的public或protect方法可以被其他包訪問的方法,我想這樣寫是因為可以間接實現讓一個子類重寫的方法的存取層級較父類的方法降低,因為重寫方法降低存取層級是不允許的。這樣假設繼承或實現了一個public方法,但是可以讓其他包無法得知他的方法,除非通過其父類來訪問。算是增加了存取控制的靈活性。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.