为什么在代码1中声明它之前无法初始化i
,但它可以在代码2中:
class Code1 {
void methodOfCode1() {
// System.out.println(i); can't use a local field before it is defined
// i = 10; can't initialize a local field before it is defined
int i;
}
}
class Code2{
static
{
i = 10; //A field can be initialized before it is defined.
}
static int i;
}
答案 0 :(得分:3)
答案是执行顺序。
代码按顺序执行,您必须在使用之前定义某些内容。因此,在使用方法时,必须在使用之前声明变量。
在Java中,编译器initializes在多次传递中class
。它首先运行并声明所有静态成员,然后为所有静态成员设置默认值。这一切都发生在任何方法(静态或非静态)执行之前。
答案 1 :(得分:0)
在Java中,必须先声明变量的类型才能使用它。
例如:
System.out.println(i); // for this statement i is unknown/undefined...
i = 10; // same for above...
已编辑:
首先在class Code1
内,
你在使用它之前没有声明变量,这违反了Java Standard API,所以显然编译器会抱怨。
进入class Code2
案例,
你已宣布'静态' instance
以及block
。
所以它不需要任何实例来加载它。 (深入了解静态概念会让你走向正确的方向)
答案 2 :(得分:0)
Java是强类型的,你不能使用你不知道它是什么的东西。例如,如果方法接收到String
或者它收到int
,则方法是不同的,因此编译器必须能够知道哪个是被调用的正确方法
例如,这是有效的:
public void dealWithIt(int val){
val++
System.out.println(val);
}
public void dealWithIt(String val){
System.out.println(val);
}
在知道变量的类型之前,编译器无法为变量赋值。
答案 3 :(得分:0)
它是变量&的范围。在使用之前缺少类型:您还没有定义i
。您必须先定义变量才能使用它:
int i = 0;
System.out.println(i); // works
System.out.println(j); // will not work
byte j;
Here's Java语言规范为您提供了详细信息。
答案 4 :(得分:0)
在初始化变量期间,会根据数据类型分配一定量的内存。
除非您分配内存,否则无法初始化值。
答案 5 :(得分:0)
因为编译器必须知道此变量的存储位置以及必须使用的字节数。如果我在初始化之前告诉计算机var = 97,它就不知道这个“var”变量的存储位置。此外,如果“var”是char,则计算机需要一个字节存储在RAM中。但是它也可以是4个字节的整数(取决于不同的系统)。因此,系统会有一个模糊的情况。编译器不合理地允许这样做。