2

我目前正在参加 CSE 入门课程,并从课堂上的一些材料中提出了问题。在其中一张幻灯片上,教授定义了这种方法:

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

根据教授的说法, retval 返回/保存一个值 100,但是当我打开 Eclipse/Command line 并编写该方法时,它不会编译。它一直说 retval 被声明了两次,因此不会编译程序。关于这里出了什么问题的任何指导?另外,“retval = itemp;”的意义何在?? 它们都被初始化为相同的值,那么这条线有什么用途吗?

4

2 回答 2

1

Eclipse/命令行并编写了方法,它不会编译。它一直说 retval 被声明了两次,因此不会编译程序。

更好的可能是这样的代码:

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;
   }
}

另外,“retval = itemp;”的意义何在??

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


它们都被初始化为相同的值,那么这条线有什么用途吗?

不,他们不是。itemp 在两个位置的值不同。

于 2013-10-23T01:26:00.927 回答
1

这不会编译,因为您不能identifiersame scope.

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

class MyClass {
  private int myVar = 1;

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

这是有效的,因为 myVarvisible在范围内redeclare()但未在其中声明!

{}不会创建一个全新的范围,因此您的老师想要做的事情失败了。

此外:

int retval, itemp = 100;
retval = itemp;

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

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

于 2013-10-23T01:34:11.187 回答