1>static:靜態修飾符
static表示「全局」或者「靜態」的意思,用來修飾成員變量和成員方法,也能夠造成靜態static代碼塊,可是Java語言中沒有全局變量的概念。
被static修飾的成員變量和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的全部實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。所以,static對象能夠在它的任何對象建立以前訪問,無需引用任何對象。
用public修飾的static成員變量和成員方法本質是全局變量和全局方法,當聲明它類的對象時,不生成static變量的副本,而是類的全部實例共享同一個static變量。
static變量前能夠有private修飾,表示這個變量能夠在類的靜態代碼塊中,或者類的其餘靜態成員方法中使用(固然也能夠在非靜態成員方法中使用--廢話),可是不能在其餘類中經過類名來直接引用,這一點很重要。實際上你須要搞明白,private是訪問權限限定,static表示不要實例化就可使用,這樣就容易理解多了。static前面加上其它訪問權限關鍵字的效果也以此類推。
static修飾的成員變量和成員方法習慣上稱爲靜態變量和靜態方法,能夠直接經過類名來訪問,訪問語法爲:
類名.靜態方法名(參數列表...)
類名.靜態變量名
用static修飾的代碼塊表示靜態代碼塊,當Java虛擬機(JVM)加載類時,就會執行該代碼塊(用處很是大)。
一、static變量
按照是否靜態的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態變量或類變量;另外一種是沒有被static修飾的變量,叫實例變量。
二者的區別是:
對於靜態變量在內存中只有一個拷貝(節省內存),JVM只爲靜態分配一次內存,在加載類的過程當中完成靜態變量的內存分配,可用類名直接訪問(方便),固然也能夠經過對象來訪問(可是這是不推薦的)。
對於實例變量,沒建立一個實例,就會爲實例變量分配一次內存,實例變量能夠在內存中有多個拷貝,互不影響(靈活)。
二、靜態方法
靜態方法能夠直接經過類名調用,任何的實例也均可以調用,所以靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。由於實例成員與特定的對象關聯!這個須要去理解,想明白其中的道理,不是記憶!!!
由於static方法獨立於任何實例,所以static方法必須被實現,而不能是抽象的abstract。
三、static代碼塊
static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,能夠有多個,位置能夠隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,若是static代碼塊有多個,JVM將按照它們在類中出現的前後順序依次執行它們,每一個代碼塊只會被執行一次。例如:
public class Test5 {
private static int a;
private int b;
static {
Test5.a = 3;
System.out.println(a);
Test5 t = new Test5();
t.f();
t.b = 1000;
System.out.println(t.b);
}
static {
Test5.a = 4;
System.out.println(a);
}
public static void main(String[] args) {
// TODO 自動生成方法存根
}
static {
Test5.a = 5;
System.out.println(a);
}
public void f() {
System.out.println("hhahhahah");
}
}
運行結果:3
hhahhahah
1000
4
利用靜態代碼塊能夠對一些static變量進行賦值,最後再看一眼這些例子,都一個static的main方法,這樣JVM在運行main方法的時候能夠直接調用而不用建立實例。
2>this:表明當前的對象
1、this關鍵字主要有三個應用:java
(1)this調用本類中的屬性,也就是類中的成員變量; 程序員
(2)this調用本類中的其餘方法; this
(3)this調用本類中的其餘構造方法,調用時要放在構造方法的首行。spa
Public Class Student
{
String name;
//定義一個成員變量name
private void SetName(String name)
{
//定義一個參數(局部變量)
name this.name=name;
//將局部變量的值傳遞給成員變量
}
}
應用一:引用成員變量 翻譯
如上面這段代碼中,有一個成員變量name,同時在方法中有一個形式參數,名字也是name,而後在方法中將形式參數name的值傳遞給成員變量name,雖然咱們能夠看明白這個代碼的含義,可是做爲Java編譯器它是怎麼判斷的呢?究竟是將形式參數name的值傳遞給成員變量name,仍是反過來將成員變量name的值傳遞給形式參數name呢?也就是說,兩個變量名字若是相同的話,那麼Java如何判斷使用哪一個變量?此時this這個關鍵字就起到做用了。this這個關鍵字其表明的就是對象中的成員變量或者方法。也就是說,若是在某個變量前面加上一個this關鍵字,其指的就是這個對象的成員變量或者方法,而不是指成員方法的形式參數或者局部變量。爲此在上面這個代碼中,this.name表明的就是對象中的成員變量,又叫作對象的屬性,然後面的name則是方法的形式參數,代碼this.name=name就是將形式參數的值傳遞給成員變量。這就是上面這個代碼的具體含義。 對象
通常狀況下,在Java語言中引用成員變量或者成員方法都是以對象名.成員變量或者對象名.成員方法的形式。不過有些程序員即便在沒有相同變量的時候,也喜歡使用this.成員變量的形式來引用變量,這主要是從便於代碼的閱讀考慮的。一看到這個this關鍵字就知道如今引用的變量是成員變量或者成員方法,而不是局部變量。這無形中就提升了代碼的閱讀性。不過話說回來,這是this關鍵字在Java語言中的最簡單的應用。從這個應用中,咱們能夠看出this關鍵字其表明的就是對象的名字。 其實若是是局部變量的話,也是相同的道理。如在上面的代碼中,name不是形式參數,而是一個局部變量。此時Java也會遇到相同的疑惑,即變量名name表明的究竟是局部變量仍是形式參數?name=name到底表明的是什麼含義?根據局部變量的做用域,在方法內部,若是局部變量與成員變量同名的話,那麼是以局部變量爲準。但是在name=name這個賦值語句中,將局部變量的值賦值給本身,顯然並非很合適。根據代碼的含義,原本的意思應該是將局部變量賦值給成員變量。爲了更清晰的表達這個含義,爲此最好採用以下的書寫格式this.name=name。這裏的this關鍵字含義就是對象名student,爲此this.name就表示student.name。 blog
應用二:調用類的構造方法 內存
public class Student {
//定義一個類,類的名字爲student。
public Student()
{
//定義一個方法,名字與類相同故爲構造方法
this(「Hello!」); }
public Student(String name)
{ //定義一個帶形式參數的構造方法 }
}
this關鍵字除了能夠調用成員變量以外,還能夠調用構造方法。在一個Java類中,其方法能夠分爲成員方法和構造方法兩種。構造方法是一個與類同名的方法,在Java類中必須存在一個構造方法。若是在代碼中沒有顯示的體現構造方法的話,那麼編譯器在編譯的時候會自動添加一個沒有形式參數的構造方法。這個構造方法跟普通的成員方法仍是有不少不一樣的地方。如構造方法一概是沒有返回值的,並且也不用void關鍵字來講明這個構造方法沒有返回值。而普通的方法能夠有返回值、也能夠沒有返回值,程序員能夠根據本身的須要來定義。不過若是普通的方法沒有返回值的話,那麼必定要在方法定義的時候採用void關鍵字來進行說明。其次構造方法的名字有嚴格的要求,即必須與類的名字相同。也就是說,Java編譯器發現有個方法與類的名字相同才把其看成構造方法來對待。而對於普通方法的話,則要求不可以與類的名字相同,並且多個成員方法不可以採用相同的名字。在一個類中能夠存在多個構造方法,這些構造方法都採用相同的名字,只是形式參數不一樣。Java語言就憑形式參數不一樣來判斷調用那個構造方法。 作用域
在上面這段代碼中,定義了兩個構造方法,一個帶參數,另外一個沒有帶參數。構造方法都不會有返回值,不過因爲構造方法的特殊性,爲此沒必要要在構造方法定義時帶上void關鍵字來講明這個問題。在第一個沒有帶參數的構造方法中,使用了this(「Hello!」)這句代碼,這句代碼表示什麼含義呢?在構造方法中使this關鍵字表示調用類中的構造方法。若是一個類中有多個構造方法,由於其名字都相同,跟類名一致,那麼這個this究竟是調用哪一個構造方法呢?其實,這跟採用其餘方法引用構造方法同樣,都是經過形式參數來調用構造方法的。如上例中,this關鍵字後面加上了一個參數,那麼就表示其引用的是帶參數的構造方法。若是如今有三個構造方法,分別爲不帶參數、帶一個參數、帶兩個參數。那麼Java編譯器會根據所傳遞的參數數量的不一樣,來判斷該調用哪一個構造方法。從上面示例中能夠看出,this關鍵字不只能夠用來引用成員變量,並且還能夠用來引用構造方法。 編譯器
不過若是要使用這種方式來調用構造方法的話,有一個語法上的限制。通常來講,利用this關鍵字來調用構造方法,只有在無參數構造方法中第一句使用this調用有參數的構造方法。不然的話,翻譯的時候,就會有錯誤信息。這跟引用成員變量不一樣。若是引用成員變量的話,this關鍵字是沒有位置上的限制的。若是不熟悉這個限制的話,那麼仍是老老實實的採用傳統的構造方法調用方式爲好。雖然比較麻煩,可是至少不會出錯。
應用三:返回對象的值
this關鍵字除了能夠引用變量或者成員方法以外,還有一個重大的做用就是返回類的引用。如在代碼中,可使用return this,來返回某個類的引用。此時這個this關鍵字就表明類的名稱。如代碼在上面student類中,那麼代碼表明的含義就是return student。可見,這個this關鍵字除了能夠引用變量或者成員方法以外,還能夠做爲類的返回值,這纔是this關鍵字最引人注意的地方。