我想學習Java的朋友應當都在學習的路上遇到過這樣的疑問,Java中的修飾符,對public,private,protected還算熟習,
可是對final,static等就不太清楚了,對Java中類,方法,變量的默許修飾符好像就更不了解了,我們今天就和大家1起
學習1下,Java中各種各樣奇妙的修飾符。
首先,我們要明白在Java中修飾符的作用主要有兩種,1種是用來控制訪問權限的,另外一種是用來控制其他方面的(比如值是不是可改,訪問的方式,是不是可覆蓋等等)。而,在訪問權限方面,1般分為以下幾種:類內可訪問,包內可訪問,子類可訪問等幾種范圍。我們也主要圍繞這幾種范圍進行分析。
Java中的變量,主要分為兩類,1類是方法內的變量,1類是類內的變量(或叫類的屬性或字段)。而方法內的變量只能用1種修飾符final。表示常量,不能更改。類內的變量卻是有很多,下面我們來具體分析1下。
1. 訪問權限控制方面:
// 變量的修飾符,關于訪問權限控制方面
public String publicString = "public";
protected String protectedString = "protected";
private String privateString = "private";
String defaultString = "default";
我們可以看到主要有4類修飾符,public,protected,private還有1個是默許的(default)。那末他們的訪問權限如何呢?
public: 任何地方都可以訪問,對訪問無窮制。
protected: 同1個包內或不同包內的子類可以訪問。
private: 同1個類內可以訪問。
默許(default): 同1個包內可以訪問。
2. 其他控制方面:
class Test{
static String staticString = "static";
final String finalString = "final";
}
我們可以看到其他方面的控制修飾符主要有兩個,static,final。
static表示該變量無需取得其所屬類的對象就能夠訪問。甚么意思呢?就是說,對上面的例子,我可以通過Test.staticString的方式,直接訪問staticString這個變量。固然了,你也能夠通過Test test = new Test(); test.staticString的方式進行訪問,但是其實不推薦通過這類方式進行訪問。
final表示該變量1旦賦值以后,其值將不會再產生改變。如上面所示,如果你再使用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的方式來獲得這個類的對象,能夠有效控制對象的創建行動,這在有些設計模式中是非常重要的。
關于類的修飾符主要有4種,以下:
// public,默許,abstract,final。
public class Test1 {}
class Test2{}
abstract class Test3{}
final class Test4{}
其中public,和默許(default)是訪問控制修飾符,和變量的完全相同,不再贅述。
abstract是表示該類為1個抽象類,不能實例化該類,即不能使用Test3 test3 = new Test3();的方式獲得Test3的實例。
final表示該類不能被子類繼承,該類即為終究類,不可再被繼承。
接口比較特殊,接口的修飾符只有public和默許(default),其控制權限和變量完全相同,不再贅述。
值得注意的是,接口中的變量只能為:public static final 變量名。固然了,你也能夠不寫這些修飾符,編譯器會自動幫你加上的,由于編譯器默許情況下就是這樣修飾的。
接口中的方法,只能用public和abstract修飾符,固然了,你也能夠不寫這些修飾符,一樣,編譯器會自動幫你加上的。
PS:至于變量為何必須聲明為public static final請參照我的另外一篇博客: Java接口中的成員變量為何必須聲明為public static final?