java中static變量和方法的總結


轉自:http://blog.csdn.net/haobo920/article/details/5921621

java中static變量和方法的總結

java中一切皆是對象

一個類中對象的定義一般都是分一下的兩步來進行的:
1/    A a;                                     //定義了一個類A的引用
2/    a=new A("10","2563");        //真正地建立了對象a,也就是a指向了內存中一塊連續的區域

        也就是說通常我們說的創建了一個類,只是指出了這個類的外觀和行為,除非用new 創建那個類的一個對象,否則的話,實際上並未得到任何的東西。只有執行了new以后,才會正式生成數據存儲空間,並可使用相應的方法。
        但是如果我們要只想用一個存儲區域來保存一個特定的數據——無論要創建多少個對象,甚至根本不創建對象。或者我們需要一個特殊的方法,它沒有與這個類的任何對象關聯。也就是說,即使沒有創建對象,也需要一個能調用的方法。為滿足這兩方面的要求,可使用static(靜態)關鍵字。

         一旦將什么東西設為static,數據或方法就不會同那個類的任何對象實例聯系到一起。所以盡管從未創建那個類的一個對象,仍能調用一個static方法,或訪問一些static數據。而非靜態的方法或者變量就必須知道它們操作的具體對象

         下面是java編程思想中的例子和解釋:

         例如,下述代碼能生成一個static數據成員,並對其初始化:

class StaticTest { 
Static int i = 47; 
}

現在,盡管我們制作了兩個StaticTest對象,但它們仍然只占據StaticTest.i的一個存儲空間。這兩個對象都共享同樣的i。請考察下述代碼: 
StaticTest st1 = new StaticTest(); 
StaticTest st2 = new StaticTest(); 
此時,無論st1.i還是st2.i都有同樣的值47,因為它們引用的是同樣的內存區域。 
有兩個辦法可引用一個static變量。正如上面展示的那樣,可通過一個對象命名它,如st2.i。亦可直接用它的類名引用,而這在非靜態成員里是行不通的(最好用這個辦法引用static變量,因為它強調了那個變量的"靜態"本質)。 
StaticTest.i++; 
其中,++運算符會使變量增值。此時,無論st1.i還是st2.i的值都是48。 
類似的邏輯也適用於靜態方法。既可象對其他任何方法那樣通過一個對象引用靜態方法,亦可用特殊的語法格式"類名.方法()"加以引用。靜態方法的定義是類似的: 
class StaticFun { 
static void incr() { StaticTest.i++; } 

從中可看出,StaticFun的方法incr()使靜態數據i增值。通過對象,可用典型的方法調用incr(): 
StaticFun sf = new StaticFun(); 
sf.incr(); 
或者,由於incr()是一種靜態方法,所以可通過它的類直接調用: 
StaticFun.incr(); 
盡管是"靜態"的,但只要應用於一個數據成員,就會明確改變數據的創建方式(一個類一個成員,以及每個對象一個非靜態成員)。若應用於一個方法,就沒有那么戲劇化了。對方法來說,static一項重要的用途就是幫助我們在不必創建對象的前提下調用那個方法。正如以后會看到的那樣,這一點是至關重要的——特別是在定義程序運行入口方法main()的時候。 
和其他任何方法一樣,static方法也能創建自己類型的命名對象。所以經常把static方法作為一個"領頭羊"使用,用它生成一系列自己類型的"實例"。

測試例子:
package moonsoft.test.testDataStructure;


public class TestDriver 

public TestDriver() 


public static void main(String []args) 

TestDriver td=new TestDriver(); 
String month=td.monthName(3);//通過對象調用static method,不建議使用 
month=TestDriver.monthName(4);//標准的調用static method 
String month1=td.monthName1(3);//通過對象調用非static method    如果需要訪問非靜態方法的話,可以這樣使用
month1=TestDriver.monthName1(4); //此處會出錯
/*不通過對象調用非static method: 
month1=monthName1(4);// 會出錯。。。。。
* Error(14,23): non-static method monthName1(int) cannot be referenced from a static context*/ 
System.out.println(month+a);//靜態方法調用靜態變量 
System.out.println(month1+a);//靜態方法調用靜態變量 
System.out.println(month+a1); 
/*靜態方法調用非靜態變量 
*Error(17,30): non-static variable a1 cannot be referenced from a static context*/

 


public static String monthName(int month)//static method 

switch ( month) 

case 1: return "Jan"; 
case 2: return "Feb"; 
case 3: return "Mar"; 
case 4: return "Apr"; 
case 5: return "May"; 
case 6: return "Jun"; 
default: return "others";



public String monthName1(int month)//not a static method 

switch ( month) 

case 1: return "Jan"; 
case 2: return "Feb"; 
case 3: return "Mar"; 
case 4: return "Apr"; 
case 5: return "May"; 
case 6: return "Jun"; 
default: return "others";



public static int add(int t) 

int s=t; 
s++; 
return s; 

public static double a; 
public double a1;

}


免責聲明!

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



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