5

请看下面的代码。方法 printTest() 正在打印未初始化变量的默认值,但是当涉及到 main 方法时,java 要求进行变量初始化。谁能解释为什么?

   public class Test1 {

    public static void main(String[] args) {   
      int j;
      String t;

      System.out.println(j);
      System.out.println(t);
    }
  }


  public class Test2 {

   int i;
   String test;

  public static void main(String[] args)   {   
    new Test().printTest();
  }

   void printTest()   {
     System.out.println(i);
     System.out.println(test);
  }

  }
4

7 回答 7

11

局部变量主要用于中间计算,而实例变量应该携带用于未来和中间计算的数据。Java 不强制初始化实例变量并允许默认值,但对于局部变量,开发人员调用它来分配值。因此,为避免错误,您需要初始化局部变量。

于 2013-10-18T07:11:58.613 回答
2

这是编译器可以知道的问题。

在 Main 方法的情况下,编译器肯定知道变量没有被初始化。

但是在 printTest 方法的情况下,编译器确实知道它可能是初始化类变量的其他方法(或相同的包类)。

于 2013-10-18T07:13:25.577 回答
2

您的全局变量未在任何地方初始化。您正在尝试打印 var i 并使用未看到/不存在的值进行测试。它不是 null 或 0 也不是空白。

您的情况与此有点相似(来自答案:Uninitialized int vs Integer

i == 0; Uninitialized
i == null; Undefined
test == 0; java.lang.NullPointerException
test == null; Uninitialized

但是当涉及到 main 方法时,java 要求进行变量初始化。

您的局部变量 i 和 t 与全局变量的情况类似。

变量需要初始化。我个人认为,任何带有变量的计算都需要有一个初始值,否则它将不存在。

计算机目前基于计算/数学的物理使用,因此无论数学中的规则是什么,它也将应用于计算机,除非我们已经进入了计算量子或其他东西的新阶段。

在数学中,变量是一个符号(通常是字母字符),表示一个值,该值可能在给定问题或一组操作的范围内发生变化。

(来自:http://en.wikipedia.org/wiki/Variable_(mathematics)

因此,根据该规则,对我来说没有任何值的变量是不存在的空 = x 是空的,并且没有已知的计算空的方法,因为没有人可以看到它。

于 2013-10-18T07:27:11.360 回答
1

原语的 Java 文档

局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化局部变量,请确保在尝试使用它之前为其分配一个值。访问未初始化的局部变量将导致编译时错误。

于 2013-10-18T07:12:17.897 回答
0

你必须在java中初始化局部变量。就那么简单。但是,如果您没有值,则可以将值设置为 null。注意:int 是一种简单的数据类型,不能有 null 值,因此我将类更改为“Integer”,这是无论如何都会环绕 in​​t 的类。

public class Test {

    int i;
    String test;

    public static void main(String[] args) {
        Integer j = null;
        String t = null;
        //other options for initialization value:
        t = new String();
        t = "";

        System.out.println(j);
        System.out.println(t);

        new Test().printTest();
    }

    void printTest() {
        System.out.println(i);
        System.out.println(test);
    }
}
于 2013-10-18T07:11:34.463 回答
0

我认为,局部变量不会作为 JVM 类加载的一部分加载到内存中,因此没有为这些变量分配默认值。由于原语没有“空”概念,因此您应该显式地为局部变量赋值。

开放讨论!!

于 2013-10-18T07:18:17.543 回答
0

在您的程序中,当您在 if-else 循环中使用变量时,您的变量需要携带一些值,并且我可以看到程序是否进入 else 循环,没有任何内容可以显示为“sizeDisplay”,这就是您的 sizeDisplay 需要的原因初始化为“空”。

于 2017-11-10T06:36:07.910 回答