靜態變量和靜態方法都屬於靜態對象,它與非靜態對象的差異須要作個說明。html
比對以下:java
擁有屬性:是類共同擁有的android
內存分配:內存空間上是固定的bash
分配順序: 先分配靜態對象的空間ui
擁有屬性: 是類各對象獨立擁有的this
內存分配: 空間在各個附屬類裏面分配spa
分配順序: 繼而再對非靜態對象分配空間,也就是初始化順序是先靜態再非靜態.code
A,靜態對象的數據在全局是惟一的,一改都改。若是你想要處理的東西是整個程序中惟一的,弄成靜態是個好方法。 非靜態的東西你修改之後只是修改了他本身的數據,可是不會影響其餘同類對象的數據。htm
B,引用方便。直接用 類名.靜態方法名 或者 類名.靜態變量名就可引用而且直接能夠修改其屬性值,不用get和set方法。對象
C,保持數據的惟一性。此數據全局都是惟一的,修改他的任何一處地方,在程序全部使用到的地方都將會體現到這些數據的修改。有效減小多餘的浪費。
D,static final用來修飾成員變量和成員方法,可簡單理解爲「全局常量」。對於變量,表示一旦給值就不可修改;對於方法,表示不可覆蓋。
一般狀況下,類成員必須經過它的類的對象訪問,可是能夠建立這樣一個成員,它可以被它本身使用,而沒必要引用特定的實例。在成員的聲明前面加上關鍵字static就能建立這樣的成員。若是一個成員被聲明爲static,它就可以在它的類的任何對象建立以前被訪問,而沒必要引用任何對象(跟類是否有static修飾無關)。
你能夠將方法和變量都聲明爲static。static 成員的最多見的 例子是main( ) 。聲明爲static的方法有如下幾條限制(main也是):
A,它們僅能調用其餘的static 方法
B,它們只能訪問static數據
C,它們不能以任何方式引用this 或super(this涉及到對象,super 與繼承有關)
示例:Static 塊僅在該類被加載時執行一次。下面的例子顯示的類有一個static方法,一些static變量,以及一個static 初始化塊。
public class TestNew {
static int a = 3;
static int b;
static void meth(int x){
System.out.println("x = "+x);
System.out.println("a = "+a);
System.out.println("b = "+b);
}
static {
System.out.println("static block initialized");
b = a*4;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
meth(42);
}
}
複製代碼
執行結果是:
static block initialized
x = 42
a = 3
b = 12
複製代碼
上述class TestNew的執行順序是:首先static 塊執行(打印一條消息),a被設置爲3,最後b被初始化爲a*4 成12。而後調用main(),main () 調用meth() ,把值42傳遞給x。3個println ( ) 語句引用兩個static變量a和b,以及局部變量x 。
在定義它們的類的外面,static 方法和變量能獨立於任何對象而被使用,你只要在類的名字後面加點號運算符便可。能夠看到,這種格式與經過對象引用變量調用非static方法或者變量的格式相似。示例:
class StaticDemo{
static int a = 42;
static int b = 99;
static void callme(){
System.out.println("a = "+a);
}
}
public class TestNew {
public static void main(String[] args) {
// TODO Auto-generated method stub
StaticDemo.callme();
System.out.println("b = "+StaticDemo.b);
}
}
複製代碼
執行結果:
a = 42
b = 99
複製代碼
A,首先,用內部類是由於內部類與所在外部類有必定的關係,每每只有該外部類調用此內部類。因此沒有必要專門用一個Java文件存放這個類。
B,靜態方法、靜態成員變量。它惟一的做用就是隨着類的加載(而不是隨着對象的產生)而產生,以至能夠用類名+靜態成員名直接得到。這樣靜態內部類就能夠理解了,它能夠直接被用 外部類名+內部類名 得到。舉例以下:
public class Build {
public static class VERSION {
public static final String RELEASE = getString("ro.build.version.release");
}
}
複製代碼
在外部能夠直接經過Build.VERSION.RELEASE來訪問。
補充一個:關於類中類變量的定義(與static主題無關)。WakeLock是PowerManager類中的類,已經import Android.os.PowerManager;若是要定義WakeLock型的變量,須要PowerManager.WakeLock mSmartStayWakeLock = null;若是想WakeLock mSmartStayWakeLock = null;則Import時要用import android.os.PowerManager.WakeLock;。
參考原文:www.cnblogs.com/-0_0-/artic…
參考原文:blog.sina.com.cn/s/blog_5cd7…