在java中调用对象的方法

时间:2010-04-15 01:05:44

标签: 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)

所以这个方法需要一个已经作为参数存在的骰子,因此不需要在其中创建一个新的骰子。

最后,我试图在roll上调用o

o.Dice.roll () ; 

8 个答案:

答案 0 :(得分:7)

在另一个类中,在某些方法中,您需要获取您尝试使用的类的实例。如果你在另一个包中,你需要一个import语句。

然后很简单:

// Create an instance of class Dice named dice
Dice dice = new Dice();

// call the method on the instance you just created
dice.roll();

另外,请参考Sun's documentation并尝试一些例子来帮助你。

修改以匹配您的更改:

public class Risk
{
   public static void IdiceRoll(Dice o)
   {
      o.roll();
   }
}

答案 1 :(得分:3)

从您的评论回复中可能看出,您可能无法理解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;
        }
    }

}

现在,我可以使用Dice方法调用表单(类名+方法名称)使用静态工厂方法创建新的static

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方法,因此它知道要执行滚动的边数(在这种情况下)。

更多高级主题:静态方法是一个工厂,可以根据边数创建具有不同特征/随机性的子类。例如,稍后我可以创建一个名为TrickDice的特殊Dice子类,每当有人要求使用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,您应该考虑让对象自行打印。这允许不同的子类提供不同的方式来打印自己,而不试图将所有逻辑放在单个方法中。这是一个过度使用静态方法的例子,它会降低类的价值和灵活性。

答案 2 :(得分:1)

您实例化对象,然后调用方法:

Dice redSparklyPair = new Dice();
redSparklyPair.roll();

或者我误解了你的问题?

答案 3 :(得分:1)

我不太清楚你在问什么。如果您有Dice类型的对象,则可以执行

public class NotDice {
  // ...
  public int method() {
    Dice dice = new Dice();
    dice.roll();
    // ...
  }
  // ...
}

如果您在Dice的子类中,则可以使用super关键字调用超类方法:

public class WeightedDice extends Dice {
  // ...
  public void roll() {
    // ...
    super.roll();
    // ...
  }
  // ...
}

super就像this一样,只是它看起来是类层次结构的一个级别。据我所知,没有办法调用特定的超类的方法;你只能看一级。然而,这通常就足够了。

答案 4 :(得分:1)

使用您的最新问题更新,您只需说o.roll();

即可

如果这不起作用,请仔细检查roll()方法公开 私人

答案 5 :(得分:1)

您必须创建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的{​​{1}}类型的变量,然后编译器知道可以从该对象调用哪些属性和方法。

如您所见,要在对象上调用方法,请使用Dice和方法名称,后跟参数(如果有)

.

实例(非静态)方法的工作原理

另一方面,

静态(正式的类方法)方法在类本身中运行,这就是为什么它们不需要实例。

 o.roll();

我认为你应该花点时间阅读:http://java.sun.com/docs/books/tutorial/java/concepts/并了解Java如何实现这些概念。

答案 6 :(得分:0)

Dice dice = new Dice();
dice.roll;

答案 7 :(得分:0)

您必须获取对象实例的引用,然后调用roll()

Dice dice = new Dice();
dice.roll();