JAVA的靜態變量、靜態方法、靜態類

靜態變量和靜態方法都屬於靜態對象,它與非靜態對象的差異須要作個說明。html

Java靜態對象和非靜態對象有什麼區別?

比對以下:java

靜態對象

擁有屬性:是類共同擁有的android

內存分配:內存空間上是固定的bash

分配順序: 先分配靜態對象的空間ui

非靜態對象

擁有屬性: 是類各對象獨立擁有的this

內存分配: 空間在各個附屬類裏面分配spa

分配順序: 繼而再對非靜態對象分配空間,也就是初始化順序是先靜態再非靜態.code

java靜態對象到底有什麼好處?

(1)

A,靜態對象的數據在全局是惟一的,一改都改。若是你想要處理的東西是整個程序中惟一的,弄成靜態是個好方法。 非靜態的東西你修改之後只是修改了他本身的數據,可是不會影響其餘同類對象的數據。htm

B,引用方便。直接用 類名.靜態方法名 或者 類名.靜態變量名就可引用而且直接能夠修改其屬性值,不用get和set方法。對象

C,保持數據的惟一性。此數據全局都是惟一的,修改他的任何一處地方,在程序全部使用到的地方都將會體現到這些數據的修改。有效減小多餘的浪費。

D,static final用來修飾成員變量和成員方法,可簡單理解爲「全局常量」。對於變量,表示一旦給值就不可修改;對於方法,表示不可覆蓋。

(2)靜態變量、靜態方法和靜態塊

一般狀況下,類成員必須經過它的類的對象訪問,可是能夠建立這樣一個成員,它可以被它本身使用,而沒必要引用特定的實例。在成員的聲明前面加上關鍵字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 。

(3)外部使用靜態變量或者靜態方法

在定義它們的類的外面,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
複製代碼

(4)靜態內部類是指在一個類的內部,又定義了一個用static修飾的類。能夠用C中的結構體內嵌結構體來理解。

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…

參考原文:zhidao.baidu.com/question/14…

參考原文:ddvcxj.blog.51cto.com/1064441/265…

相關文章
相關標籤/搜索