为什么Java要求在本地变量中初始化变量

5
请看下面的代码。方法printTest()打印未初始化变量的默认值,但当它到达主方法时,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);
  }

  }

2
在Java中,您需要在使用变量之前对其进行初始化。 - James Williams
2
是的,我同意。请查看代码和我的问题。 - Ashok kumar
你期望发生什么? - James Williams
现在我已经将代码分离以便更好地理解。 - Ashok kumar
全局/类变量(Test2中的变量i)将被分配默认值。但对于局部变量(Test2类中的变量j),我们需要分配一个初始值。 - bprasanna
7个回答

11

局部变量主要用于中间计算,而实例变量则应该携带未来和中间计算所需的数据。Java不强制初始化实例变量并允许默认值,但对于局部变量,开发人员需要自行决定是否赋值。因此,为了避免错误,您需要初始化局部变量。


2
您的全局变量没有在任何地方初始化。您正在尝试使用未见过/不存在的值打印var i和进行测试。它不是null或0也不是空白的。
您的情况有点类似于这种情况(来自答案: 未初始化的int vs Integer)。
i == 0; Uninitialized
i == null; Undefined
test == 0; java.lang.NullPointerException
test == null; Uninitialized

但是,当涉及到主方法时,Java会要求进行变量初始化。
你的本地变量i和t与全局变量类似。 变量需要初始化。 我个人认为,任何使用变量的计算都需要有一个初始值,否则它将不存在。
计算机目前基于计算/数学的物理使用,因此无论数学中的规则如何,它也将应用于计算机,除非我们已经进入了量子或其他更高级别的计算阶段。
在数学中,变量是指定在给定问题或一组操作范围内可能发生变化的值的符号(通常是字母字符)。
所以根据这个规则,对我来说,没有任何值的变量不存在,空= x为空,没有已知的计算空值的方法,因为没有人能看到它。

2

这是编译器所能了解的问题。

在主方法中,编译器确切知道变量没有被初始化。

但是在printTest方法中,编译器知道可能存在其他方法(或同一包中的类)对类变量进行了初始化。


1

Java 基本数据类型文档

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


0

在Java中,您必须初始化本地变量。就这么简单。但是如果您没有值,可以将该值设置为null。请注意:int是一种简单的数据类型,不能具有null值,因此我将类更改为“Integer”,这是一个包装int的类。

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

0

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

欢迎讨论!


0
在你的程序中,由于你在if-else循环中使用了变量,所以你的变量需要携带一些值。我可以看到,如果程序进入else循环,就没有任何东西显示为“sizeDisplay”,这就是为什么你的sizeDisplay需要初始化为“null”的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接