淺談this和static
一.this關鍵字
一個比較經典的使用:
輸出的結果是:12
1.this關鍵字只能在方法的內部使用,表示對“調用方法的那個對象”的引用,this的用法和其他對象引用並無不同。註意一點:在方法的內部調用同一個類的其他方法,不必使用this,直接調用即可。
2.當需要返回當前對象的引用的時候,可以借助this。
3.當方法的形參與成員變量重名的時候,可以用this區分。
從兩次顯示的結果不同可以知道,當形參和成員變量重名的時候,如果不用this加以區分,虛擬機也無法區分方法中的i到底是指向成員變量還是形參,不過這裏有一個原則,當無法確定的時候,取離參數最近的聲明,即就近聲明原則。
4.使用this,在構造器中調用構造器
註意:除構造器之外,編譯器禁止在任何其他方法中調用構造器。
二.static關鍵字
在java中並不存在全局變量的概念,static修飾的變量可以看做是一個偽全局的概念,static表示“全局”或者“靜態”的意思,常用用法有如下三種:
1.修飾變量
static修飾的變量,通常我們稱之為靜態變量,未用static修飾的變量稱為實例變量,兩者的區別是:靜態變量是類的公用變量,在類加載的是時候初始化,並且僅初始化一次,對類的所有對象來說,static成員變量只有一份,對象之間借助靜態變量可進行數據共享。實例變量則伴隨著對象的實例化,每創建一個對象就會產生一個實例變量,同一個類的不同對象的實例變量的值可能不同。static成員變量的初始化順序按照定義的順序進行初始化。
2.修飾方法
static修飾的方法,一般稱為靜態方法,靜態方法不依賴於任何對象就能進行訪問,通過類名可以直接訪問靜態方法和靜態變量。靜態方法中不能使用thi關鍵字,同樣靜態方法中不能訪問非靜態成員變量和非靜態成員方法,但是在非靜態成員方法中可以訪問靜態變量和靜態方法。因此,如果說想在不創建對象的情況下調用某個方法,就可以將這個方法設置為static。我們最常見的static方法就是main方法,至於為什麽main方法必須是static的,現在就很清楚了。因為程序在執行main方法的時候沒有創建任何對象,因此只有通過類名來訪問。
3.修飾代碼塊
static關鍵字還能修飾代碼塊,用來形成靜態塊以優化程序的性能。static塊可以出現在類中的任何地方(除了方法內部,任何方法)
static關鍵字常見誤區:
static關鍵能改變類中成員變量的訪問權限?答案是不能,Java中的static關鍵字不會影響到變量或者方法的作用域,在Java中能夠影響到訪問權限的只有private、public、protected(包括包訪問權限)這幾個關鍵字
static能修飾局部變量?不能,java語法規定,static是不允許用來修飾局部變量。
static方法中能使用this?不能,很明顯,在靜態方法中不能使用this關鍵字,靜態方法可以通過類訪問,當通過類訪問的時候,this指向的對象也許還未產生。
this能訪問靜態變量?是可以的,靜態成員變量雖然獨立於對象,但是不代表不可以通過對象去訪問,所有的靜態方法和靜態變量都可以通過對象訪問(只要訪問權限足夠)。
靜態塊可以出現在類的任何地方?答案是不能,在方法內部,在任何方法內部都不行。
淺談this和static