Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么打印静态变量值会在静态块中产生错误,而赋值时不会';T_Java_Static Initialization_Static Block - Fatal编程技术网

Java 为什么打印静态变量值会在静态块中产生错误,而赋值时不会';T

Java 为什么打印静态变量值会在静态块中产生错误,而赋值时不会';T,java,static-initialization,static-block,Java,Static Initialization,Static Block,给出误差 public class ABC { static { System.out.println(i); } static int i=10; static { System.out.println(i); } public static void main(String[] args) { System.out.println(3); ABC a

给出误差

public class ABC {


    static {       
       System.out.println(i);
    }

    static int i=10;

    static {
        System.out.println(i);
    }

    public static void main(String[] args)
    {
        System.out.println(3);

        ABC a = new ABC();
    }
}
但接下来-

can not reference a field before it is defined
不会抛出任何错误,编译和运行良好。即使我使用

public class ABC {
    static {       
        i=20;
        System.out.println(ABC.i); 
        System.out.println(i); //same error as above
    }

    static int i=10;

    static {
        System.out.println(i);
    }

    public static void main(String[] args)
    {

        System.out.println(3);

        ABC a = new ABC();
    }
}
运行良好。我很困惑为什么会出现这个错误。也有类似的问题被问到,对你们中的一些人来说,这听起来可能是重复的,但还没有找到一个明确的答案。初始化的顺序是什么。我相信静态块首先执行。如果我移动
static int I=10错误消失。静态变量在静态块之前初始化吗

package com.sample.package2;

public class ABC {

    static {  
        System.out.println(ABC.i);
    }

    static int i=10;

    static {
        System.out.println("yahan 10" + i);
    }

    public static void main(String[] args)
    {
        System.out.println(3);

        ABC a = new ABC();
    }
}
您稍后初始化变量,但在之前调用它。因此它会抛出一个错误 惠拉斯


首先初始化i,然后调用它。

您使用的称为“静态初始化块”。如果你读过,你会遇到以下情况(重点是我的)

一个类可以有任意数量的静态初始化块,它们可以出现在类主体中的任何位置运行时系统保证按照静态初始化块在源代码中出现的顺序调用它们

在代码中,您在尝试调用后声明并初始化了
i
。如果在静态初始化之前执行了此操作,则不会定义变量
i

  static {  
    System.out.println(ABC.i);
}

static int i=10;
static{

系统输出打印项次(一);//不相关的有趣事实:似乎在这个问题上,我们现在有1250000个问题标记为java。不,我不会给你一盒巧克力…:-)对不起,我会尝试改进。如果你能帮我理解这里发生了什么,我当然可以给你一些巧克力:)没什么可抱歉的。我们喜欢问题。
I=20
在第二个代码段中,没有给出它所有的静态变量都是先初始化的。因此,我已经在System.out.println之前用20初始化了。如果我们按照您的逻辑进行操作,则没有声明,因此应该会出现错误。声明在初始化之后出现。请参阅我的编辑,您的逻辑不起作用。已经考虑了很多。如果简单的说,这里不会问:)公共静态void main首先被执行,所以ABC被初始化。所以i被初始化。当你调用ABC.i时,它不会抛出任何错误,但当你只调用System.out.println(i)时它抛出了一个错误,因为它尚未声明和初始化。ABC.i是ABC类中的一个静态变量,所以即使没有初始化任何值,它也会给出0,并且不会抛出任何错误。请看第二个代码段。它在打印
i
时出错,而不是在
ABC.i
时出错。如果我们按照这个定义,会发生什么呢?@AnujSingh had to深入JLS规范,解释为什么
ABC.i
有效。更新了答案。@KareIG,那么静态
{i=20;System.out.println(ABC.i);}
如何有效并打印20?
static {       
    i=20;
    System.out.println(i);
}
  static {  
    System.out.println(ABC.i);
}

static int i=10;
static {       
   System.out.println(i); // <-- where is i ?
}

static int i=10;