某些時候,對于一個類來說,跟蹤其創(chuàng)建出來的實例個數(shù)會非常用有,其典型實現(xiàn)是通過讓它的構(gòu)造器遞增一個私有靜態(tài)域來完成的。在下面的程序中,Creature類展示了這種技巧,而Creator類對其進行了操練,將打印出已經(jīng)創(chuàng)建的Creature實例的數(shù)量。那么,這個程序會打印出什么呢?
public class Creator {
public static void main(String[] args) {
for (int i = 0; i < 100; i++)
Creature creature = new Creature();
System.out.println(Creature.numCreated());
}
}
class Creature {
private static long numCreated = 0;
public Creature() {
numCreated++;
}
public static long numCreated() {
return numCreated;
}
}
這是一個捉弄人的問題。該程序看起來似乎應(yīng)該打印100,但是它沒有打印任何東西,因為它根本就不能編譯。如果你嘗試著去編譯它,你就會發(fā)現(xiàn)編譯器的診斷信息基本沒什么用處。下面就是javac打印的東西:
Creator.java:4: not a statement
Creature creature = new Creature();
^
Creator.java:4: ’;’ expected
Creature creature = new Creature();
^
一個本地變量聲明看起來像是一條語句,但是從技術(shù)上說,它不是;它應(yīng)該是一個本地變量聲明語句(local variable declaration statement)[JLS 14.4]。Java語言規(guī)范不允許一個本地變量聲明語句作為一條語句在for、while或do循環(huán)中重復(fù)執(zhí)行[JLS 14.12-14]。一個本地變量聲明作為一條語句只能直接出現(xiàn)在一個語句塊中。(一個語句塊是由一對花括號以及包含在這對花括展中的語句和聲明構(gòu)成的。)
有兩種方式可以訂正這個問題。最顯而易見的方式是將這個聲明至于一個語句塊中:
for (int i = 0; i < 100; i++) {
Creature creature = new Creature();
}
然而,請注意,該程序沒有使用本地變量creature。因此,將該聲明用一個無任何修飾的構(gòu)造器調(diào)用來替代將更具實際意義,這樣可以強調(diào)對新創(chuàng)建對象的引用正在被丟棄:
for (int i = 0; i < 100; i++)
new Creature();
public class Creator {
public static void main(String[] args) {
for (int i = 0; i < 100; i++)
Creature creature = new Creature();
System.out.println(Creature.numCreated());
}
}
class Creature {
private static long numCreated = 0;
public Creature() {
numCreated++;
}
public static long numCreated() {
return numCreated;
}
}
這是一個捉弄人的問題。該程序看起來似乎應(yīng)該打印100,但是它沒有打印任何東西,因為它根本就不能編譯。如果你嘗試著去編譯它,你就會發(fā)現(xiàn)編譯器的診斷信息基本沒什么用處。下面就是javac打印的東西:
Creator.java:4: not a statement
Creature creature = new Creature();
^
Creator.java:4: ’;’ expected
Creature creature = new Creature();
^
一個本地變量聲明看起來像是一條語句,但是從技術(shù)上說,它不是;它應(yīng)該是一個本地變量聲明語句(local variable declaration statement)[JLS 14.4]。Java語言規(guī)范不允許一個本地變量聲明語句作為一條語句在for、while或do循環(huán)中重復(fù)執(zhí)行[JLS 14.12-14]。一個本地變量聲明作為一條語句只能直接出現(xiàn)在一個語句塊中。(一個語句塊是由一對花括號以及包含在這對花括展中的語句和聲明構(gòu)成的。)
有兩種方式可以訂正這個問題。最顯而易見的方式是將這個聲明至于一個語句塊中:
for (int i = 0; i < 100; i++) {
Creature creature = new Creature();
}
然而,請注意,該程序沒有使用本地變量creature。因此,將該聲明用一個無任何修飾的構(gòu)造器調(diào)用來替代將更具實際意義,這樣可以強調(diào)對新創(chuàng)建對象的引用正在被丟棄:
for (int i = 0; i < 100; i++)
new Creature();