Java中static的特色

前兩天面試時被問到靜態的特色,當時回答地不是很好,如今來總結一下java

在瞭解某樣東西的時候咱們一般會從它是什麼,爲何,和怎麼樣在三方面來衡量,對於java中的static,咱們也這樣討論下,要明確如下幾點:面試

一、 static在java中到底表明什麼,爲什麼要用它?數組

二、 static在java中怎麼用?函數

三、 static 有那些特色和使用的「侷限」?this

四、當成員變量被靜態修飾後,和非靜態成員變量的區別?spa

 

一、 static在java中到底表明什麼,爲什麼要用它?對象

      static――靜態――「指定位置「
      首先,咱們來看看java的內存:java把內存分爲棧內存和堆內存,棧內存用來存放一些基本類型的變量和數組及對象的引用變量,而堆內存主要是來放置對象的。
      用 static的修飾的變量和方法,其實是指定了這些變量和方法在內存中的「固定位置」-static storage。既然要有「固定位置」那麼他們的 「大小」彷佛就是固定的了,有了固定位置和固定大小的特徵了,在棧中或堆中開闢空間那就是很是的方便了。若是靜態的變量或方法在不出其做用域的狀況下,其引用句柄是不會發生改變的。
      咱們常看到:static變量有點相似於C中的全局變量的概念;靜態表示的是內存的共享,就是它的每個 實例都指向同一個內存地址。把static拿來,就是告訴JVM它是靜態的,它的引用(含間接引用)都是指向同一個位置,在那個地方,你把它改了,它就不會變成原樣,你把它清理了,它就不會回來了。生命週期

      注:java的主類中main()方法自己就是一個static的,因此main方法的執行就是在沒有產生新的實例的狀況。內存

 

二、 static在java中怎麼用?作用域

 

  • static是一個修飾符,用於修飾成員(成員變量和成員函數)。
  • 當成員被靜態修飾後,就多了一個調用方式,除了能夠被對象調用外,還能夠直接被類名調用:類名.靜態成員。
 
三、 static 有那些特色和使用的「侷限」?
(一)特色
  • 靜態成員隨着類的加載而加載;
  • 靜態成員優先於對象存在;
  • 靜態成員被全部對象所共享;
  • 靜態成員多了一箇中調用方式,能夠被類名直接調用。
(二)利弊
利:
  • 對對象的共享數據進行單獨空間的存儲,節省空間,沒有必要每個對象中都存儲一份;
  • 能夠直接被類名調用。
弊:
  • 生命週期過長;
  • 訪問出現侷限性,只能訪問靜態。
(三)注意事項
  • 靜態方法只能訪問靜態成員, 非靜態方法既能夠訪問靜態又能夠訪問非靜態;
  • 靜態方法中不能夠定義this,super關鍵字;(由於this表明是對象,而靜態存在時,有可能沒有對象,且靜態優先於對象存在。因此靜態方法運行時,this是沒有任何對象表明的。 簡單說,先進內存的數據不能夠訪問後進內存的數據,但是後進內存數據能夠訪問先進內存的數據)
  • 主函數是靜態的
 
四、當成員變量被靜態修飾後,和非靜態成員變量的區別?
  • 靜態變量也稱爲類變量,也就是直接能夠被類名調用的變量,這個變量是所屬於類的;
        非靜態變量稱爲成員變量,或者實例變量,是被對象調用的,是所屬具體對象的。
  • 靜態變量隨着類的加載而加載,也意味着隨着類的消失而消失,生命週期最長; 
        實例變量,隨着對象的建立而加載,隨着對象的消失而消失,按照對象的生命週期而存在。
  • 靜態變量存儲在方法區的靜態區中;
        實例變量存在於對象所屬的堆內存中。
  • 靜態變量數據,被全部對象所共享;
        實例變量是對象中的特有數據。
相關文章
相關標籤/搜索