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