重新定义变量和范围

时间:2013-10-23 01:23:45

标签: java

我目前正在参加CSE的入门课程,并从班级的某些材料中得到了一个问题。在其中一张幻灯片中,教授定义了这种方法:

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

从教授的说法来看,retval返回/保持值为100,但是当我打开Eclipse / Command行并编写方法时,它就无法编译。它一直说retval被宣布两次,因此不会编译该程序。对这里出了什么问题的任何指导?另外,“retval = itemp”的重点是什么? ?它们都被初始化为相同的值,那么该行的目的是什么?

2 个答案:

答案 0 :(得分:1)

  

Eclipse / Command行并编写了方法,它不会编译。它一直说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在两个位置保持不同的值。

答案 1 :(得分:1)

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

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

class MyClass {
  private int myVar = 1;

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

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

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

此外:

int retval, itemp = 100;
retval = itemp;

此处第一行声明retval itemp ,但仅初始化 itemp,因此retval未初始化。这就是第二行为其分配itemp值的原因。但由于这些是原始值,它将复制itemp的值并将其放在堆栈上,因此现在您有2个不同的值。改变一个不会改变另一个。

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