如果我們在類中這樣定義
class Man{
String mane ;
String country = "CN";
public void show()
{
System.out.println(country+":"+mane);
}
}
即:每new一個對象,指派人名之後,統一用CN(中國)這個國家
假設我們new了三個對象
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn10MrpnTwsmaNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL4EjN5ADMwQTM3ITOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
我們可以看到
country
我們都是統一
CN
的但是還是分别給指派到建立的對象中,這樣就浪費記憶體了
是以我們就可以用
static
修飾符,讓它成為靜态變量(類變量)
即:
class Man{
String mane ;
static String country = "CN";
public void show()
{
System.out.println(country+":"+mane);
}
}
這樣我們每new一個對象,它們都共享了 CN了
節省記憶體
同時static修飾符修飾之後的成員,類和對象都可以對它進行調用
System.out.println(p.country);//對象調用static修飾的成員
System.out.println(Man.country);//類調用static修飾的成員
static的特點:
特點:
1.static是一個修飾符,用于修飾成員.
2.static修飾的成員被是以的對象所共享
3.static優先于對象存在,因為static的成員随着類的加載就已經存在了.
4.static修飾成員多了一種調用方式,就可以直接被類名所調用. 類名.靜态成員
5.static修飾的資料是共享資料,對象中存儲的是特有的資料.
成員變量和靜态變量的差別?
1,兩個的生命周期不同.
成員變量随着對象的建立而存在,随着對象的被回收而釋放.
靜态變量随着類的加載而存在,随着類的消失而消失.
2,調用方式不同.
成員變量隻能被對象調用.
靜态變量可以被對象調用,還可以被類名調用.
3,别名不同.
成員變量也稱為執行個體變量.
靜态變量稱為類變量.
4,資料存儲位置不同
成員變量存儲在堆記憶體的對象中,是以也叫對象的特有資料.
靜态變量資料存儲在方法區(的靜态區),是以也叫對象的共享資料.
static(靜态)修飾使用的注意事項:
1.靜态方法隻能通路靜态成員.(非靜态既可以通路靜态,又可以通路非靜态)
2.靜态方法中,不可以使用this或super關鍵字
3.主函數是靜态的.
static(靜态)修飾什麼時候用?
1.靜态變量.
當分析對象中所具備的成員變量的值都是相同的.
這時這個成員就可以被靜态修飾.
隻要資料在對象中都是不同的,就是對象的特有資料,必須存儲在對象中,是非靜态的
如果是相同的資料,對象不需要修改,隻需要使用即可,不需要存儲在對象中,定義成靜态的
2.靜态函數.
函數是否靜态修飾,就參考一點,就是該函數功能是否有通路到對象的特有資料
簡單點說,從源代碼看,該功能是否需要通路非靜态的成員變量,如果需要,該功能就是非靜态的.
如果不需要,就可以将該功能定義成靜态的.
當然也可以定義成非靜态,但是非靜态需要被對象調用,而建立對象調用非靜态的沒有通路特有
資料的方法,該對象的建立沒有意義,還浪費記憶體.