別說你懂修飾符——深入分析Java修飾符

來源:互聯網
上載者:User

標籤:修飾符   控制   java   final   預設修飾符   

    我想學習Java的朋友應該都在學習的路上遇到過這樣的疑問,Java中的修飾符,對public,private,protected還算熟悉,可是對final,static等就不太清楚了,對Java中類,方法,變數的預設修飾符好像就更不瞭解了,我們今天就和大家一起學習一下,Java中各種各樣奇妙的修飾符。
一、範圍介紹

首先,我們要明白在Java中修飾符的作用主要有兩種,一種是用來控制存取權限的,另一種是用來控制其他方面的(比如值是否可改,訪問的方式,是否可覆蓋等等)。而,在存取權限方面,一般分為以下幾種:類內可訪問,包內可訪問,子類可訪問等幾種範圍。我們也主要圍繞這幾種範圍進行分析。

二、變數的修飾符

Java中的變數,主要分為兩類,一類是方法內的變數,一類是類內的變數(或者叫類的屬性或欄位)。而方法內的變數只能用一種修飾符final。表示常量,不能更改。類內的變數卻是有很多,下面我們來具體分析一下。

1. 存取權限控制方面:

    // 變數的修飾符,關於存取權限控制方面    public String publicString = "public";    protected String protectedString = "protected";    private String privateString = "private";    String defaultString = "default";

我們可以看到主要有四類修飾符,public,protected,private還有一個是預設的(default)。那麼他們的存取權限如何呢?

public: 任何地方都可以訪問,對訪問無限制。
protected: 同一個包內或者不同包內的子類可以訪問。
private: 同一個類內可以訪問。
預設(default): 同一個包內可以訪問。

2. 其他控制方面:

class Test{    static String staticString = "static";    final String finalString = "final";    }

我們可以看到其他方面的控制修飾符主要有兩個,static,final。

static表示該變數無需獲得其所屬類的對象就可以訪問。什麼意思呢?就是說,對於上面的例子,我可以通過Test.staticString的方式,直接存取staticString這個變數。當然了,你也可以通過Test test = new Test(); test.staticString的方式進行訪問,但是並不推薦通過這種方式進行訪問。

final表示該變數一旦賦值之後,其值將不會再發生改變。如上面所示,如果你再使用finalString = “hello”的方式修改其值的話,就會報錯,且無法修改。

三、非建構函式的修飾符

1. 存取權限控制方面

     // 關於方法的修飾符    public void printPublic() {        System.out.println("public method");    }    protected void printProtected() {        System.out.println("protected method");    }    private void printPrivate() {        System.out.println("private method");    }    void printDefault() {        System.out.println("default method");    }

非建構函式的存取權限與變數的完全相同,這裡不再贅述。

2. 其他控制方面:

    static void printStatic() {        System.out.println("static method");    }    final void printFinal() {        System.out.println("final method");    }    abstract void printAbstract();

其中static和變數中的static具有相同的含義。final也表示,在繼承關係中,這個方法是不可以被子類覆蓋重寫的。而abstract是指需要子類實現的抽象方法。

四、建構函式的修飾符

建構函式的修飾符只有存取權限控制方面:

class TestA {    //關於建構函式的修飾類    public TestA(){    }    protected TestA(int i){    }    private TestA(int i,int j){    }    TestA(String string){    }    }

其中,private限制建構函式後,其他類中將不能夠通過new的方式來擷取這個類的對象,能夠有效控制對象的建立行為,這在有些設計模式中是非常重要的。

五、類的修飾符

關於類的修飾符主要有四種,如下:

// public,預設,abstract,final。public class Test1 {}class Test2{}abstract class Test3{}final class Test4{}

其中public,和預設(default)是存取控制修飾符,和變數的完全相同,不再贅述。

abstract是表示該類為一個抽象類別,不能執行個體化該類,即不能使用Test3 test3 = new Test3();的方式擷取Test3的執行個體。

final表示該類不能被子類繼承,該類即為最終類,不可再被繼承。

六、關於介面

介面比較特殊,介面的修飾符只有public和預設(default),其控制許可權和變數完全相同,不再贅述。

值得注意的是,介面中的變數只能為:public static final 變數名。當然了,你也可以不寫這些修飾符,編譯器會自動幫你加上的,因為編譯器預設情況下就是這樣修飾的。

介面中的方法,只能用public和abstract修飾符,當然了,你也可以不寫這些修飾符,同樣,編譯器會自動幫你加上的。

PS:至於變數為什麼必須聲明為public static final請參照我的另一篇部落格: Java介面中的成員變數為什麼必須聲明為public static final?

別說你懂修飾符——深入分析Java修飾符

聯繫我們

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