java靜態標示符static詳解


1、static修飾的變量習慣稱為靜態變量,static修飾的方法稱為靜態方法,static修飾的代碼塊叫做靜態代碼塊。

1)static變量

  static變量也稱作靜態變量,靜態變量和非靜態變量的區別是:靜態變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類初次加載時會被初始化。而非靜態變量是對象所擁有的,在創建對象的時候被初始化,存在多個副本,各個對象擁有的副本互不影響。

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

1 public   static String sr ="woshidashabi";

 

2)static方法

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

 

1 public static void f(){......};

 

3)static代碼塊

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

1    static{
2         startDate = Date.valueOf("1946");
3         endDate = Date.valueOf("1964");
4     }

 

參考博客:http://www.cnblogs.com/dolphin0520/p/3799052.html(大字體比較顯眼)

2、java的靜態變量也叫做類變量,它開始於類的創建,結束於類的消亡。非靜態變量叫做實例變量,它開始於類的實例的創建,結束語類的實例的消亡。

靜態變量被所有實例所共享。

3、java中為什么靜態類可以直接調用方法?

因為該類的靜態方法是程序啟動時自動放在內存中了的,是屬於程序的公共內存(但只能訪問),而類名在這里你可以理解為命名空間。先通俗的分析下,我們把類看作是一個房子。房子里面有家具,桌椅板凳之類的,房子里面還有人。
房子里面所有的人都應該是共有一套家具的。也就是說,這些家具是唯一的,如果某個家具壞了,那么大家都用不了。
我們再看一看定義,java的靜態變量也叫做類變量,它開始於類的創建,結束於類的消亡。非靜態變量叫做實例變量,它開始於類的實例的創建,結束語類的實例的消亡。靜態變量被所有實例所共享。也就是如上面的例子,座椅板凳是類變量,它們是在房子被建好了之后就被添加放置進來,而且基本都是唯一的。人就相當於實例,每個人都能用這些家具,但是如果家具一旦損壞,那就是壞了,或者你把某一個家具搬走,那么所有的人都用不了這個家具,房子里也不存在這個家具了。
但是房子里可以進很多人,可以進張三,也可以進李四。所以這些人就是類的實例對象,他們身上穿的衣服就可以叫做實例變量。
如果一個類中有靜態變量的話,程序首先會把該靜態變量加載進內存中,也就是在堆中開辟一個區域專門存放。以后不管你new多少個類的對象,該靜態變量永遠都是在那里的。也就是說,靜態變量在類的初始化一次后,系統就不會為該變量開辟新的內存空間。而每new一個類的對象,系統就會重新在
堆內存中開辟一個新空間來存放該類的實例對象,並且棧中也會有一個新的引用變量去指向它。
靜態方法也是類似,但是有一點要強調,靜態方法只中不能調用非靜態方法。因為被static修飾的方法會首先被Classloader對象先加載進內存,而這個時候可能其它的非靜態方法或者變量還沒有被加載進來。就好比我現在想做包子,現在面粉被static修飾,首先已經拿到你身邊,可是因為包子餡不是static修飾的,所以可能包子餡兒還沒運過來,你說怎么做的出包子呢。
被static修飾過的都是隨着類的初始化后就產生了,在堆內存中都有一塊專門的區域來存放,所以只需要類名點方法名或者變量名即可。而非靜態的就必須通過類的對象去調相應的。就像是你想要紅色的衣服,你必須是從穿紅色的衣服的人的身上拿過來才行,所以你必須找到穿紅色衣服的人,也就是類的實例對象,而你如果要去找一個桌子,而桌子就在房間里擺着,你只要進到房間里直接走過去拿來就可以了

4、static關鍵字的用途

在《Java編程思想》P86頁有這樣一段話:

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

方便在沒有創建對象的情況下來進行調用(方法/變量)。

 

其實如果非要在靜態方法中調用非靜態方法,也是有辦法解決的。

 1 public class StaticMethodTest{
 2     void NonStaticMethod(){
 3         System.out.println("This is copy 別人的代碼");
 4     }
 5 //NonStaticMethod()是一個非靜態的方法
 6     
 7    static void StaticMethod(StaticMethodTest s){
 8        System.out.println("太懶了,不想寫.");
 9        s.NonStaticMethod();
10     }
11  /***我們在StaticMethod()方法中調用了NonStaticMethod()方法,在這里我們做了一個折中的辦法,在靜態方法加載的時候,我們並不能創建對象實例來用於調用非靜態方法,但是我們在這里只是創建了一個引用並沒有創建實例。所以沒有違反java的語法,所以編譯可以通過,當有調用這個靜態方法時,外部會傳進來一個實例的引用,然后通過實例來調用方法NonStaticMethod()。*********/
12 
13 public static void main(String[] args) {
14         StaticMethodTest sObj=new StaticMethodTest();//創建一個實例
15         StaticMethod(sObj);  //調用靜態方法,並傳進去一個實例的引用。
16     }
17 }

注意:java的引用可以單獨存在,不一定非要依存於實例。

1 String   sr;//創建一個名字為sr的引用
2 
3 String mm="sm";//創建一個引用為mm的實例
4 
5 sr=mm;//將mm對應的引用賦值給sr,這里只是復制引用,並沒有操縱sm。

 

5.static關鍵字會改變類中成員的訪問權限嗎?

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

 

 6.能通過this訪問靜態成員變量嗎?

 1 public class Main {  
 2     static int value = 33;
 3  
 4     public static void main(String[] args) throws Exception{
 5         new Main().printValue();
 6     }
 7  
 8     private void printValue(){
 9         int value = 3;
10         System.out.println(this.value);
11     }
12 }
13 
14 //結果是33

 這里面主要考察隊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語法的規定。

ps:以上皆是別人的內容,怕自己來回找着麻煩,就集中整理了一下。具體博客地址,本文最大字體》》》》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM