Java-当我将值存储在变量中时为什么会无效

时间:2018-06-26 17:27:40

标签: java void

所以,问题是。如果我从类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);
       }
    }

3 个答案:

答案 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的功能混淆了,该功能允许在没有类实例的情况下调用方法。