簡體   English   中英

在Java中對對象調用方法

[英]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

你在說 有一個名為oDice類型的變量,然后編譯器知道可以從該對象調用什么屬性和什么方法。

如您所見,要在對象上調用方法,請使用. 以及方法名稱及其后的參數(如果有)

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM