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

    我想學習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?

發佈了46 篇原創文章 · 獲贊 113 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章