所以,问题是。如果我从类Player
调用方法猜测,并且它是一个没有返回语句的空类型方法,那么我怎么能将number = (int)(Math.random() * 10)
的结果存储在number
中3个不同对象(p1, p2, p3)
的变量?
我什么时候应该使用return语句或void类型方法几乎没有什么困惑,因为如果number = (int)(Math.random() * 10)
给出了一些我想使用的结果,那么为什么我不需要从一种将它们传递给我在number
中声明的int number = 0;
变量的方法
public class Player {
int number = 0;
public void guess() {
number = (int)(Math.random() * 10);
System.out.println("I'm guessing " + number);
}
}
答案 0 :(得分:3)
void
方法不返回任何内容,但仍允许您执行操作。 (打印到控制台,修改变量等)void
关键字仅表示它不返回值。 (在void
方法中,您仍然可以使用空白的return;
结束该方法)并且由于您正在修改number
对象中的GuessGame
变量,因此所做的更改将保留即使您不返回变量。试试这个简单的测试,看看我的意思:
//In your GuessGame class
int number = 0;
public void foo() {
number++;
}
public static void main(String[] args) {
GuessGames games = new GuessGames();
games.foo();
System.out.println(games.number);
//Outputs 1
}
docs用于return
语句
答案 1 :(得分:1)
重点是:运行程序时,Math.random() * 10
物理上的结果存储在计算机上的什么位置?您列出了两个选项。
选项1:“实例”字段
在这种情况下,编译器指示您的操作系统在int
对象的整个生命周期中为Player
变量保留空间。播放器对象可能会存活数微秒,几秒钟,几分钟,几小时,几天,几个月……这取决于!通常可以在计算机的RAM中找到该存储空间,只要您在某处有Player引用,就可以使用语法myPlayer.number
从Java中访问它。
选项2:返回值
在这种情况下,编译器会在Java虚拟机的寄存器中找到用于存储计算结果的空间,您可以在思维上将其映射到物理处理器的寄存器。如果您不将其存储在其他地方,则该值最多只能在几个处理器周期内保留下来(在GHz CPU中有gazillinos,因此,实际上只有几分之一秒)。失去了永远。请参见以下示例:
private int someRandom;
private int gimmeARandom() {
return Math.random() * 10;
}
private int test() {
int someRandom = gimmeARandom(); // --> store the value until end of method
this.someRandom = someRandom; // --> further keep it so we can read it later
gimmeARandom(); // --> what did it returned? We'll never know
}
答案 2 :(得分:0)
无效与静态不同-void
仅表示该函数不返回任何内容,但仍可以是一个实例方法,即与类的每个new
实例相关联的实例方法。我认为您将此与static
的功能混淆了,该功能允许在没有类实例的情况下调用方法。