【轉】JAVA的靜態變量、靜態方法、靜態類

轉自:http://blog.csdn.net/zhandoushi1982/article/details/8453522/html

 

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

(1)Java靜態對象和非靜態對象有什麼區別?android

      比對以下:app

                                         靜態對象                                                        非靜態對象     
擁有屬性:                是類共同擁有的                                             是類各對象獨立擁有的
內存分配:               內存空間上是固定的                                      空間在各個附屬類裏面分配 
分配順序:               先分配靜態對象的空間                    繼而再對非靜態對象分配空間,也就是初始化順序是先靜態再非靜態.
       java靜態對象到底有什麼好處?
oop

A,靜態對象的數據在全局是惟一的,一改都改。若是你想要處理的東西是整個程序中惟一的,弄成靜態是個好方法。 非靜態的東西你修改之後只是修改了他本身的數據,可是不會影響其餘同類對象的數據。 
B,引用方便。直接用 類名.靜態方法名  或者  類名.靜態變量名就可引用而且直接能夠修改其屬性值,不用get和set方法。
C,保持數據的惟一性。此數據全局都是惟一的,修改他的任何一處地方,在程序全部使用到的地方都將會體現到這些數據的修改。有效減小多餘的浪費。ui

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

       一般狀況下,類成員必須經過它的類的對象訪問,可是能夠建立這樣一個成員,它可以被它本身使用,而沒必要引用特定的實例。在成員的聲明前面加上關鍵字static就能建立這樣的成員。若是一個成員被聲明爲static,它就可以在它的類的任何對象建立以前被訪問,而沒必要引用任何對象(跟類是否有static修飾無關)。spa

       你能夠將方法和變量都聲明爲static。static 成員的最多見的 例子是main( ) 。聲明爲static的方法有如下幾條限制(main也是??):  ·.net

A,它們僅能調用其餘的static 方法code

B,它們只能訪問static數據

C,它們不能以任何方式引用this 或super(this涉及到對象,super 與繼承有關)

       示例:Static 塊僅在該類被加載時執行一次。下面的例子顯示的類有一個static方法,一些static變量,以及一個static 初始化塊。

[java]  view plain copy
 在CODE上查看代碼片派生到個人代碼片
  1. public class TestNew {  
  2.     static int a = 3;  
  3.     static int b;  
  4.     static void meth(int x){  
  5.         System.out.println("x = "+x);  
  6.         System.out.println("a = "+a);  
  7.         System.out.println("b = "+b);  
  8.     }  
  9.     static {  
  10.         System.out.println("static block initialized");  
  11.         b = a*4;  
  12.     }  
  13.     public static void main(String[] args) {  
  14.         // TODO Auto-generated method stub  
  15.         meth(42);  
  16.     }  
  17. }  

       執行結果是:

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方法或者變量的格式相似。示例:

[java]  view plain copy
 在CODE上查看代碼片派生到個人代碼片
  1. class StaticDemo{  
  2.     static int a = 42;  
  3.     static int b = 99;  
  4.     static void callme(){  
  5.         System.out.println("a = "+a);  
  6.     }  
  7. }  
  8. public class TestNew {  
  9.     public static void main(String[] args) {  
  10.         // TODO Auto-generated method stub  
  11.         StaticDemo.callme();  
  12.         System.out.println("b = "+StaticDemo.b);  
  13.     }  
  14. }  

     執行結果:

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;。

      

參考原文:http://www.cnblogs.com/-0_0-/articles/1962368.html

參考原文:http://blog.sina.com.cn/s/blog_5cd7f5b40100r0rt.html

參考原文:http://zhidao.baidu.com/question/149873207.html

參考原文:http://ddvcxj.blog.51cto.com/1064441/265347

相關文章
相關標籤/搜索