在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)