1. 程式人生 > >Java中的static, getApplicationContext(),Context()區別

Java中的static, getApplicationContext(),Context()區別



類的初始化順序如下:
父類靜態變數
父類靜態塊
子類靜態變數
子類靜態塊(靜態方法被載入一次之後就不在載入了)
父類變數
父類普通塊
父類建構函式(子類例項化時先要呼叫父類建構函式)
子類變數
子類普通塊
子類建構函式

1.使用範圍:類、方法、變數。

2.區別和聯絡:

2.1.static 含義:靜態的,被 static 修飾的方法和屬性只屬於類不屬於類的任何物件。
2.2.static 用法:
2.2.1.static 可以修飾【內部類】、方法和成員變數。
2.2.2.static【不可以修飾外部類】、【不可以修飾區域性變數】(因為 static 本身就是定義為類級別的,所以區域性級別的變數是不可以用 static 修飾的)。

2.3 final 含義:【只能賦值一次】的。
2.2.final 用法:
2.2.1.final 修飾屬性,表示屬性【只能賦值一次】,(1)基本型別:值不能被修改;(2)引用型別:引用不可以被修改該。
2.2.2.final 修飾方法,表示方法不可以重寫,但是可以被子類訪問(如果方法不是 private 型別話)。
2.2.2.final 修飾類,表示類不可以被繼承。

3.聯合使用 static final

3.1.適用範圍:

3.1.2.兩者範圍的交集,所以只能修飾:成員變數、方法、內部類。

3.2.含義:也是二者交集:
3.2.1.方法:屬於類的方法且不可以被重寫。
3.2.2.成員變數:屬於類的變數且只能賦值一次。
3.2.3.內部類:屬於外部類,且不能被繼承

一、static關鍵字用途

static方法就是沒有this的方法。在static方法內部不能呼叫非靜態方法,反過來是可以的。而且可以在沒有建立任何物件的前提下,僅僅通過類本身來呼叫static方法。這實際上正是static方法的主要用途。

很顯然,被static關鍵字修飾的方法或者變數不需要依賴於物件來進行訪問,只要類被載入了,就可以通過類名去進行訪問。

static可以用來修飾類的成員方法、類的成員變數,另外可以編寫static程式碼塊來優化程式效能。

1)static方法

  static方法一般稱作靜態方法,由於靜態方法不依賴於任何物件就可以進行訪問,因此對於靜態方法來說,是沒有this的,因為它不依附於任何物件,既然都沒有物件,就談不上this了。並且由於這個特性,在靜態方法中不能訪問類的非靜態成員變數和非靜態成員方法,因為非靜態成員方法/變數都是必須依賴具體的物件才能夠被呼叫。

  但是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變數,但是在非靜態成員方法中是可以訪問靜態成員方法/變數的。

2)static變數

  static變數也稱作靜態變數,靜態變數和非靜態變數的區別是:靜態變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化。而非靜態變數是物件所擁有的,在建立物件的時候被初始化,存在多個副本,各個物件擁有的副本互不影響。

  static成員變數的初始化順序按照定義的順序進行初始化。

3)static程式碼塊

  static關鍵字還有一個比較關鍵的作用就是 用來形成靜態程式碼塊以優化程式效能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。

  為什麼說static塊可以用來優化程式效能,是因為它的特性:只會在類載入的時候執行一次。

二、static關鍵字誤區

1.static關鍵字會改變類中成員的訪問許可權嗎?

  有些初學的朋友會將java中的static與C/C++中的static關鍵字的功能混淆了。在這裡只需要記住一點:與C/C++中的static不同,Java中的static關鍵字不會影響到變數或者方法的作用域。在Java中能夠影響到訪問許可權的只有private、public、protected(包括包訪問許可權)這幾個關鍵字。

2.能通過this訪問靜態成員變數嗎?

  雖然對於靜態方法來說沒有this,那麼在非靜態方法中能夠通過this訪問靜態成員變數嗎?

這裡面主要考察隊this和static的理解。this代表什麼?this代表當前物件,那麼通過new Main()來呼叫printValue的話,當前物件就是通過new Main()生成的物件。而static變數是被物件所享有的,因此在printValue中的this.value的值毫無疑問是33。在printValue方法內部的value是區域性變數,根本不可能與this關聯,所以輸出結果是33。在這裡永遠要記住一點:靜態成員變數雖然獨立於物件,但是不代表不可以通過物件去訪問,所有的靜態方法和靜態變數都可以通過物件訪問(只要訪問許可權足夠)。

3.static能作用於區域性變數麼?

  在C/C++中static是可以作用域區域性變數的,但是在Java中切記:static是不允許用來修飾區域性變數。不要問為什麼,這是Java語法的規定。

getApplication(),Context()的區別

從接觸android起,到處都能看到context(上下文)的身影,檢視原始碼之後你會發現,它只是個抽象類,具體實現都在ContextWrapper實現。

當你去檢視android的原始碼時,你會發現activity,service和application都繼承自ContextWrapper,也就是說它們都是context的子類,那我們應該如何給context的賦值呢?

很多時候在acitivity中給context賦值時直接傳一個this,這個this就是xxxActivity.this,也就是XXXActivity的上下文,當然剛開始不懂的時候會直接寫getApplicationContext(),當然兩者的區別是很明顯的,XXXActivity.this返回的當前Activity的例項,getApplicationContext()返回的是application的例項,兩者的生命週期差很多,application貫穿整個app,activity的生命週期相信你很清楚了,所以不能亂用,防止記憶體洩漏

1.dialog

       dialog依附於activity存在,所以直接用XXXActivity.this就好,當activity消失的時候dialog也就銷燬了

2.activity

      上面我們已經說過了,直接使用XXXActivity.this,返回的是當前的activity例項,當前activity銷燬時,一起銷燬

3.service,broadcastReceiver

兩者都可以

總結:和UI操作相關的不建議使用getApplicationContext(),一般都使用和activity相關的context,其餘的操作,看具體情況,根據存在的生命週期的長度作出選擇