这是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 () ;
答案 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();