为什么java要求在本地变量时初始化变量
请参阅下面的代码。 方法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); } }
局部变量主要用于中间计算,而实例变量应该携带用于未来和中间计算的数据。 Java并不强制初始化实例变量并允许默认值,但对于局部变量,开发人员调用它来赋值。 因此,为了避免错误,您需要初始化局部变量。
这是编译器可以知道的问题。
对于Main方法,编译器确定变量尚未初始化。
但是对于printTest方法,编译器确实知道可能是初始化类变量的其他方法(或相同的包类)。
您的全局变量未在任何位置初始化。 您正在尝试打印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与全局变量类似。
变量需要初始化。 我个人认为任何带变量的计算都需要具有初始值,否则它将不存在。
计算机目前基于计算/数学的物理使用,因此无论Math中的规则是什么,它都将应用于计算机,除非我们已进入计算量子的新阶段或更进一步。
在数学中,变量是一个符号(通常是一个字母字符),指定一个值,该值可能在给定问题或一组操作的范围内发生变化。
(来自: http : //en.wikipedia.org/wiki/Variable_ ( mathematics) )
因此,根据该规则,对我来说没有任何值的变量是不存在的空= x是空的,并且没有已知的方法来计算空虚,因为没有人可以看到它。
原语的Java文档
局部变量略有不同; 编译器永远不会为未初始化的局部变量分配默认值。 如果无法初始化声明它的局部变量,请确保在尝试使用它之前为其赋值。 访问未初始化的局部变量将导致编译时错误。
您必须在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); } }
我认为,局部变量不会作为JVM类加载的一部分加载到内存中,因此没有为这些变量分配默认值。 由于基元没有“null”概念,因此应明确为局部变量赋值。
开放讨论!!
在你的程序中,你的变量需要携带一些值,因为你在if-else循环中使用变量,因为我可以看到程序是否转到了else循环,没有什么可以显示为’sizeDisplay’这就是你的sizeDisplay需要的原因初始化为“null”。
- 将PDF文件转换为图像
- 如何使用Math.cos()和Math.sin()?
- 如何在Cassandra中列出列族中的所有列名?
- JSF 2.0每次从selectOneMenu中选择一个项目时,如何显示不同的h:panelGroup
- 搜索并替换没有大括号的if语句以包括大括号
- Spring Security注销不起作用 – 不清除安全上下文,并且经过身份validation的用户仍然存在
- 泽西岛2. *。 如何替换Jersey 1的InjectableProvider和AbstractHttpContextInjectable
- 将文件从actionscript发送到servlet
- Hibernate:如何在注释中使用级联?