[英]Invoking methods on objects in java
這是Dice類的相關部分:
import java.util.*;
class Dice
{
String name ;
int x ;
int[] sum ;
...
public Dice (String name)
{
this.name = name ;
this.x = 0 ;
this.sum = new int[7] ;
}
...
public void roll ()
{
this.x = randNum(1, this.sum.length) ;
this.sum[x] ++ ;
}
我在名為Risk
的單獨類中調用此方法
class Risk
{
這是方法的第一行:
public static void IdiceRoll (Dice o)
因此,此方法采用一個已經存在的作為參數的骰子,因此無需在其中創建新的骰子。
最終,這是我嘗試調用o
roll
:
o.Dice.roll () ;
在另一個類中,通過某種方法,您需要獲取要使用的類的實例。 如果您在另一個軟件包中,則需要導入聲明。
然后很簡單:
// Create an instance of class Dice named dice
Dice dice = new Dice();
// call the method on the instance you just created
dice.roll();
另外,請參考Sun的文檔並嘗試使用示例來幫助自己。
修訂以匹配您的更改:
public class Risk
{
public static void IdiceRoll(Dice o)
{
o.roll();
}
}
這似乎從您的評論的反應,你可能不明白之間的差別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()
將不起作用,因為必須相對於實例調用roll方法,因此它知道要進行滾動的面數(在這種情況下)。
更高級的主題:該靜態方法是一種工廠,可以根據邊數創建具有不同特征/隨機性的子類。 例如,稍后我可以創建一個特殊的Dice子類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
方法的有效用法之一。 同樣,盡管不要過度使用靜態方法,但是在學習語言時,請盡量使用常規方法。
編輯 :我在另一個問題中注意到您使用此方法簽名:
public static void printDice (Dice Dice)
在這里,您使用相同的字母大小寫命名了類和變量。 我在此問題中解決此問題的原因是,這可以幫助您解決在此處表達的一些困惑。 您應該注意用於類和變量的名稱。 奇怪的是,Java實際上接受這種語法。 第一個Dice
是類名(類型),第二個Dice
是參數名。 相反,您應該對變量/參數名稱使用小寫字母,因此應如下所示:
public static void printDice (Dice dice)
這樣,當您使用對象引用( dice
)或類名( Dice
)時,該方法將更加清晰。
另外,此打印方法可能應該是Dice
類上的方法。 使用OOP,您應該考慮讓對象自己打印。 這允許不同的子類提供不同的打印方式,而不必嘗試將所有邏輯放在一個方法中。 這是過度使用靜態方法的示例,該方法會降低類的價值和靈活性。
您實例化該對象,然后調用該方法:
Dice redSparklyPair = new Dice();
redSparklyPair.roll();
還是我誤會了你的問題?
我不太清楚你要問什么。 如果您有Dice
類型的對象,則可以執行
public class NotDice {
// ...
public int method() {
Dice dice = new Dice();
dice.roll();
// ...
}
// ...
}
如果您在Dice
的子類中,則可以使用super
關鍵字調用superclass方法:
public class WeightedDice extends Dice {
// ...
public void roll() {
// ...
super.roll();
// ...
}
// ...
}
super
就像this
,除了它看起來在類層次結構的上一級。 據我所知,沒有辦法調用特定的超類的方法。 您只能向上看一級。 不過,通常就足夠了。
最新的問題更新中,您只需要說o.roll();
如果這不起作用,請再次檢查roll()
方法是public而不是 private 。
您必須創建Dice
類的實例 ,然后調用它。
假設您有一個Game
類:
class Risk {
public static void IdiceRoll (Dice o) {
// You have to roll the dice
// The dice already exist, you just... roll it!!
o.roll();
// And that's it
}
}
Dice
是類的名稱,該類就像模板或藍圖。 它定義了事物(例如變量和方法)。
要使用一個類,通常需要從中創建一個對象 。 在這種情況下,您可以根據需要命名對象(在本例中,將其命名為o
)。
因此,當您聲明:
Dice o
你在說 有一個名為o
的Dice
類型的變量,然后編譯器知道可以從該對象調用什么屬性和什么方法。
如您所見,要在對象上調用方法,請使用.
以及方法名稱及其后的參數(如果有)
o.roll();
這就是實例 (非靜態)方法的工作方式
另一方面, 靜態 (正式為類方法)方法在類本身中操作,這就是為什么它們不需要實例的原因。
So, it is possible to invoke them directly:
Risk.IdiceRoll( aDiceInstance );
我認為您應該花一點時間閱讀以下內容: http : //java.sun.com/docs/books/tutorial/java/concepts/並了解Java如何實現這些概念。
Dice dice = new Dice();
dice.roll;
您將必須獲得對該對象實例的引用,然后調用roll()
Dice dice = new Dice();
dice.roll();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.