2019/3/5 11:48:38
一、static
請先看下面這段程序:
public class Hello{
public static void main(String[] args){//(1)
System.out.println("Hello,world!");//(2)
}
}
看過這段程序,對于大(dà)多數學過Java 的(de)從來說,都(dōu)不陌生。即使沒有(yǒu)學過Java,而學過其它的(de)高(gāo)級語言,例如(rú)C,那您也(yě)應該能(néng)看懂這段代碼的(de)意思。它隻是簡單的(de)輸出“Hello,world”,一點别的(de)用(yòng)處都(dōu)沒有(yǒu),然而,它卻展示了static關鍵字的(de)主要用(yòng)法。
在1處,我們定義了一個(gè)靜态的(de)方法名爲main,這就意味著(zhe)告訴Java編譯器(qì),我這個(gè)方法不需要創建一個(gè)此類的(de)對象即可(kě)使用(yòng)。您還得您是怎麽運行(xíng)這個(gè)程序嗎?一般,我們都(dōu)是在命令行(xíng)下,打入如(rú)下的(de)命令(加下劃線爲手動輸入):
javac Hello.java
java Hello
Hello,world!
這就是您運行(xíng)的(de)過程,第一行(xíng)用(yòng)來編譯Hello.java這個(gè)文(wén)件(jiàn),執行(xíng)完後,如(rú)果您查看當前,會(huì)發現多了一個(gè)Hello.class文(wén)件(jiàn),那就是第一行(xíng)産生的(de)Java二進制(zhì)字節碼。第二行(xíng)就是執行(xíng)一個(gè)Java程序的(de)最普遍做法。執行(xíng)結果如(rú)您所料。在2中,您可(kě)能(néng)會(huì)想,爲什(shén)麽要這樣才能(néng)輸出。好,我們來分(fēn)解一下這條語句。(如(rú)果沒有(yǒu)安裝Java文(wén)檔,請到(dào)Sun的(de)官方網站浏覽J2SE API)首先,System是位于java.lang包中的(de)一個(gè)核心類,如(rú)果您查看它的(de)定義,您會(huì)發現有(yǒu)這樣一行(xíng):public static final PrintStream out;接著(zhe)在進一步,點擊PrintStream這個(gè)超鏈接,在METHOD頁面,您會(huì)看到(dào)大(dà)量定義的(de)方法,查找println,會(huì)有(yǒu)這樣一行(xíng):
public void println(String x)。好了,現在您應該明(míng)白爲什(shén)麽我們要那樣調用(yòng)了,out是System的(de)一個(gè)靜态變量,所以可(kě)以直接使用(yòng),而out所屬的(de)類有(yǒu)一個(gè)println方法。
靜态方法
通常,在一個(gè)類中定義一個(gè)方法爲static,那就是說,無需本類的(de)對象即可(kě)調用(yòng)此方法。如(rú)下所示:
class Simple{
static void go(){
System.out.println("Go...");
}
}
public class Cal{
public static void main(String[] args){
Simple.go();
}
}
調用(yòng)一個(gè)靜态方法就是“類名.方法名”,靜态方法的(de)使用(yòng)很簡單如(rú)上(shàng)所示。一般來說,靜态方法常常爲應用(yòng)程序中的(de)其它類提供一些實用(yòng)工(gōng)具所用(yòng),在Java的(de)類庫中大(dà)量的(de)靜态方法正是出于此目的(de)而定義的(de)。
靜态變量
靜态變量與靜态方法類似。所有(yǒu)此類實例共享此靜态變量,也(yě)就是說在類裝載時,隻分(fēn)配一塊存儲空間,所有(yǒu)此類的(de)對象都(dōu)可(kě)以操控此塊存儲空間,當然對于final則另當别論了。看下面這段代碼:
class Value{
static int c=0;
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
public static void main(String[] args){
Value v1,v2;
v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
}
結果如(rú)下:
v1.c=0 v2.c=0
v1.c=1 v2.c=1
由此可(kě)以證明(míng)它們共享一塊存儲區。static變量有(yǒu)點類似于C中的(de)全局變量的(de)概念。值得探討(tǎo)的(de)是靜态變量的(de)初始化問題。我們修改上(shàng)面的(de)程序:
class Value{
static int c=0;
Value(){
c=15;
}
Value(int i){
c=i;
}
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
Value v=new Value(10);
static Value v1,v2;
static{
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1=new Value(27);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(15);
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
public static void main(String[] args){
Count ct=new Count();
prt("ct.c="+ct.v.c);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
prt("ct.c="+ct.v.c);
}
}
運行(xíng)結果如(rú)下:
v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
v1.c=11 v2.c=11
ct.c=11
這個(gè)程序展示了靜态初始化的(de)各種特性。如(rú)果您初次接觸Java,結果可(kě)能(néng)令您吃驚。可(kě)能(néng)會(huì)對static後加大(dà)括号感
深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04
咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967