轉自:http://blog.csdn.net/haobo920/article/details/5921621java
java中static變量和方法的總結編程
java中一切皆是對象測試
一個類中對象的定義通常都是分一下的兩步來進行的:
1/ A a; //定義了一個類A的引用
2/ a=new A("10","2563"); //真正地創建了對象a,也就是a指向了內存中一塊連續的區域.net
也就是說一般咱們說的建立了一個類,只是指出了這個類的外觀和行爲,除非用new 建立那個類的一個對象,不然的話,實際上並未獲得任何的東西。只有執行了new之後,纔會正式生成數據存儲空間,並可以使用相應的方法。
可是若是咱們要只想用一個存儲區域來保存一個特定的數據——不管要建立多少個對象,甚至根本不建立對象。或者咱們須要一個特殊的方法,它沒有與這個類的任何對象關聯。也就是說,即便沒有建立對象,也須要一個能調用的方法。爲知足這兩方面的要求,可以使用static(靜態)關鍵字。對象
一旦將什麼東西設爲static,數據或方法就不會同那個類的任何對象實例聯繫到一塊兒。因此儘管從未建立那個類的一個對象,仍能調用一個static方法,或訪問一些static數據。而非靜態的方法或者變量就必須知道它們操做的具體對象blog
下面是java編程思想中的例子和解釋:內存
例如,下述代碼能生成一個static數據成員,並對其初始化:it
class StaticTest {
Static int i = 47;
}class
如今,儘管咱們製做了兩個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方法做爲一個"領頭羊"使用,用它生成一系列本身類型的"實例"。test
測試例子:
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;
}