在java中对对象调用方法

在java中对对象调用方法,java,Java,以下是骰子类的相关部分: import java.util.*; class Dice { String name ; int x ; int[] sum ; 我在一个名为Risk class Risk { 这里是该方法的第一行: public static void IdiceRoll (Dice o) 所以这个方法将一个已经存在的骰子作为参数,所以不需要在其中创建一个新的骰子 最后,这里是我如何在o上调用roll: o.Dice.roll ()

以下是骰子类的相关部分:

import java.util.*;
class Dice 
{ 
    String name ; 
    int x ; 
    int[] sum ; 

我在一个名为
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();
同时,参考并尝试一些例子,让你的脚在你脚下

修订以匹配您的更改:

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

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

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

还是我误解了您的问题?

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


我不太清楚你在问什么。如果您有一个类型为
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
类似,只是它看起来比类层次结构高一级。据我所知,无法调用特定超类的方法;你只能向上看一层。不过,这通常就足够了。

对于最新的问题更新,您只需要说
o.roll()

如果这不起作用,请仔细检查
roll()
方法是否为public,而是否为private。

您必须创建
Dice
类的实例,然后调用它

假设您有一个
游戏
类:

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
类型的变量,编译器知道可以从该对象调用哪些属性和方法

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

这就是实例(非静态)方法的工作方式

静态(类方法)方法在另一方面,在类本身中操作,这就是它们不需要实例的原因

So, it is possible to invoke them directly:

 Risk.IdiceRoll( aDiceInstance );

我认为您真的应该花点时间阅读本文:并理解Java是如何实现这些概念的

从您的评论回复中可以看出,您可能不理解
静态方法与非静态方法之间的区别

要调用静态方法,请使用类和方法名称。让我们举一个稍微修改的例子:

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
方法调用表单(类名+方法名):

但对于普通方法,您可以针对实例化对象调用它们,因为它们可能对与该对象一起存储的数据进行操作。在本例中,我创建了一个对象,该对象保存在参考变量
d
中,该对象包含它应该为其生成数字的边数。要调用它,请使用:

int value = d.roll();
与静态方法相比,使用常规方法有许多优点。不要过度使用
静态方法。静态方法不是继承的,也不是对象的一部分——它们只是类的一部分。这就是使用类名调用静态方法的原因(尽管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的特殊骰子子子子类,每当有人要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
这是
静态方法的有效用法之一。同样,尽管不要过度使用静态方法,但在学习语言时尽量使用常规方法

编辑:我在另一篇文章中注意到您使用此方法签名:

public static void printDice (Dice Dice)
在这里,您使用相同的字母大小写命名了类和变量。我在这个问题中提到这一点,因为这可能有助于解决您在这里表达的一些困惑。对于类和变量使用的名称,您应该谨慎。奇怪的是,Java实际上接受这种语法。第一个
Dice
是类名(type),第二个
Dice
是参数名。相反,您应该使用小写字母作为变量/参数名称,因此它应该如下所示:

public static void printDice (Dice dice)
然后,当您使用对象引用(
dice
)或类名(
dice
)时,方法中的内容将更加清晰

此外,这个print方法可能应该是
Dice
类上的一个方法。使用OOP,您应该考虑要求对象打印自己。这允许不同的子类提供不同的方法来
int value = d.roll();
Dice six = Dice.create(6);
Dice twenty = Dice.create(20);

// Use the dice for a 1D6 + 1D20 roll.
int value = six.roll() + twenty.roll();
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
public static void printDice (Dice Dice)
public static void printDice (Dice dice)