從您的評論回覆可以看出,您可能不瞭解static
與非靜態方法之間的區別。
要調用靜態方法,請使用類和方法名稱。讓我們稍微修改例如:
public class Dice {
private static final Random RANDOM = new Random();
private int sides;
protected Dice(int sides) {
this.sides = sides;
}
public static Dice create(int sides) {
return new Dice(sides);
}
public int roll() {
synchronized(RANDOM) {
return RANDOM.nextInt(sides) + 1;
}
}
}
現在,我可以使用使用static
方法調用的形式(類名+方法名)的靜態工廠方法創建一個新的Dice
:
Dice d = Dice.create(6);
但對於您調用它們的常規方法與實例化對象有關,因爲它們可能會使用該對象存儲的數據進行操作。在這種情況下,我創建了一個保存在參考變量d
中的對象,並且此對象包含應該爲其生成數字的邊數。要調用它,請使用:
int value = d.roll();
使用常規方法比靜態方法有許多優點。不要過度使用static
方法。靜態方法不是繼承的,也不是對象的一部分 - 它們只被認爲是類的一部分。這就是爲什麼使用類名稱調用靜態方法的原因(儘管Java不幸地允許使用object.method,但好的IDE會警告你)。沒有相關的內存狀態。然而,一個對象本身也具有內存狀態,並且可能有許多具有不同值的類的不同實例。在這裏,我們可以創建不同面的骰子:
Dice six = Dice.create(6);
Dice twenty = Dice.create(20);
// Use the dice for a 1D6 + 1D20 roll.
int value = six.roll() + twenty.roll();
在這個例子中,我叫上兩個不同的對象實例的roll
方法。使用Dice.roll()
將不起作用,因爲必須針對實例調用滾動方法,以便知道有多少面(在本例中)用於執行滾動。
更多高級主題:該靜態方法是一個工廠,可以根據邊的數量創建具有不同特徵/隨機性的子類。例如,以後我可以創建一個特殊子類骰子叫TrickDice任何時候有人問他們得到其中的一個有5個骰子只需改變create
方法:
public static Dice create(int sides) {
if (sides == 5)
return new TrickDice(5);
else
return new Dice(sides);
}
這並不會改變它被稱爲...
Dice d = Dice.create(5); // This really is a TrickDice
這是static
方法的有效用法之一。再說一次,儘管不要過度使用靜態方法,但應儘量使用正常方法,因爲您正在學習語言。
編輯:我在另一個question您使用此方法簽名注意到:
public static void printDice (Dice Dice)
在這裏,你必須使用相同的字母大小寫命名類和變量。我在這個問題中解決這個問題,因爲這可能會幫助你解決你在這裏表達的一些困惑。你應該小心你用於類和變量的名字。奇怪的是,Java實際上接受這種語法。第一個Dice
是類名(類型),第二個Dice
是參數名稱。相反,你應該使用小寫字母的變量/參數名,所以它應該是這樣的:
public static void printDice (Dice dice)
然後,它會在你使用一個對象引用(dice
)是在方法中更清晰或班級名稱(Dice
)。
此外,此打印方法可能應該是Dice
類中的方法。使用OOP時,您應該考慮讓對象自行打印。這允許不同的子類提供不同的方式來打印自己,而不用試圖將所有的邏輯放在一個單獨的方法中。這是過度使用靜態方法的一個例子,它會降低類的價值和靈活性。
請注意,(免費)Sun文檔包含幾個教程,這些教程對於學習像這樣的東西非常有用。 http://java.sun.com/docs/books/tutorial/ – atk 2010-04-15 01:10:57
在這篇文章的某處有什麼問題嗎? – 2010-04-15 02:56:29
@ luis.espinal曾經有過,顯然它在編輯中丟失了 – David 2010-04-15 03:42:49