有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重新定义变量和范围

我目前正在参加CSE的介绍课程,有一个问题来自课堂上的一些材料。在其中一张幻灯片上,教授定义了这种方法:

public int myMethod()
{
  int retval, itemp = 100;
  retval = itemp;
  {
     int retval, itemp = 75; 
     retval = itemp; 
  }
    return retval;
}

根据教授所说,retval返回/保持值为100,但当我打开Eclipse/命令行并编写该方法时,它不会编译。它一直说retval声明了两次,因此不会编译程序。这里出了什么问题,有什么指导吗?还有,“retval=itemp;”的意义是什么?它们都初始化为相同的值,那么这行有什么用途吗


共 (2) 个答案

  1. # 1 楼答案

    Eclipse/Command line and wrote the method, it wouldn't compile. It kept saying that retval was declared twice and therefore would not compile the program.

    最好是这样的代码:

    public class Foo {
       int retval, itemp = 100;
    
    
       public static void main(String[] args) {
          Foo foo = new Foo();
          System.out.println(foo.myMethod());
       }
    
       public int myMethod() {
          retval = itemp;
          {
             int retval, itemp = 75;
             retval = itemp;
          }
          return retval;
       }
    }
    

    Also, what's the point of "retval = itemp;" ?

    这会将retVal变量设置为保存一个值


    They're both initialized to the same value, so is there a purpose for that line?

    不,他们不是。itemp在这两个位置中持有不同的值

  2. # 2 楼答案

    这不会编译,因为不能在same scope中两次声明具有相同identifier的变量

    可以做的是重新声明给定范围内的现有变量:

    class MyClass {
      private int myVar = 1;
    
      public void redeclare() {
        // ...
        int myVar = 2;
        System.out.println(myVar);
        // ...
      }
    }
    

    这是因为myVar在visible的范围内,但没有在其中声明

    {}没有创建一个全新的作用域,因此您的老师想要做的事情失败了

    此外:

    int retval, itemp = 100;
    retval = itemp;
    

    这里的第一行声明了retvalitemp,但只初始化了itemp,所以retval是未初始化的。这就是为什么第二行将itemp值分配给它。但由于这些是基本值,它将复制itemp的值并将其放在堆栈上,因此现在有两个不同的值。改变一个不会改变另一个

    没有冒犯教授的意思。但如果我是你,我会放弃那些幻灯片,去拿一本关于Java的好书(比如核心Java或Java思维)和一些CS入门书(因为这是本课程的目标?)比如“计算机程序的结构和解释”