Java lare variable inside main()它显示找不到变量。这两种情况有什么不同?对不起,我第一次不明白。在运行时,首先静态变量获得内存,然后执行静态块。所以静态块获取所有变量,即使您在静态块之后声明了它们。方法语句是按顺序执行的,因此首先必须

Java lare variable inside main()它显示找不到变量。这两种情况有什么不同?对不起,我第一次不明白。在运行时,首先静态变量获得内存,然后执行静态块。所以静态块获取所有变量,即使您在静态块之后声明了它们。方法语句是按顺序执行的,因此首先必须,java,static,initialization,declaration,Java,Static,Initialization,Declaration,lare variable inside main()它显示找不到变量。这两种情况有什么不同?对不起,我第一次不明白。在运行时,首先静态变量获得内存,然后执行静态块。所以静态块获取所有变量,即使您在静态块之后声明了它们。方法语句是按顺序执行的,因此首先必须声明它,然后只有您才能使用它。@Nicksilion方法中的所有语句都是按顺序执行的。方法变量在执行变量声明或赋值语句时获取内存。所以,如果您试图在变量声明之前使用它,jvm将在内存中找不到它,并抛出找不到符号。@defaultlocale否,




lare variable inside main()它显示找不到变量。这两种情况有什么不同?对不起,我第一次不明白。在运行时,首先静态变量获得内存,然后执行静态块。所以静态块获取所有变量,即使您在静态块之后声明了它们。方法语句是按顺序执行的,因此首先必须声明它,然后只有您才能使用它。@Nicksilion方法中的所有语句都是按顺序执行的。方法变量在执行变量声明或赋值语句时获取内存。所以,如果您试图在变量声明之前使用它,jvm将在内存中找不到它,并抛出找不到符号。@defaultlocale否,这是不同的。仔细阅读我的问题。我的意思是,如果我们在main()中使用并声明变量,它将显示未找到变量。这两种情况有什么不同?对不起,我第一次不明白。在运行时,首先静态变量获得内存,然后执行静态块。所以静态块获取所有变量,即使您在静态块之后声明了它们。方法语句是按顺序执行的,因此首先必须声明它,然后只有您才能使用它。@Nicksilion方法中的所有语句都是按顺序执行的。方法变量在执行变量声明或赋值语句时获取内存。所以,若您试图在变量声明之前使用它,jvm将在内存中找不到它,并抛出找不到符号。编译器如何知道在静态块之后有声明。当程序按顺序运行时,它不应该知道变量是否在后面声明。这与程序运行无关。编译器可以向前看,并多次通过程序。编译是在程序开始运行之前发生的。那么为什么在main()方法中执行相同的操作时,它看起来不合适呢?它不是实例变量,而是方法中的局部变量,规则也不同。如果你想知道语言设计者为什么这样写规则,你必须问他们。他们本可以在声明局部变量之前允许使用它们。不管他们的理由是什么,我相信他们有很好的理由,即使我们不明白为什么。我有参与语言设计讨论的经验(针对不同的语言),我知道他们在做每一个决定时都会考虑很多。“规则”是人们在不知道确切答案时使用的语句。可以联系语言设计师吗?我想知道原因。没关系,谢谢。编译器如何知道静态块后有声明。当程序按顺序运行时,它不应该知道变量是否在后面声明。这与程序运行无关。编译器可以向前看,并多次通过程序。编译是在程序开始运行之前发生的。那么为什么在main()方法中执行相同的操作时,它看起来不合适呢?它不是实例变量,而是方法中的局部变量,规则也不同。如果你想知道语言设计者为什么这样写规则,你必须问他们。他们本可以在声明局部变量之前允许使用它们。不管他们的理由是什么,我相信他们有很好的理由,即使我们不明白为什么。我有参与语言设计讨论的经验(针对不同的语言),我知道他们在做每一个决定时都会考虑很多。“规则”是人们在不知道确切答案时使用的语句。可以联系语言设计师吗?我想知道原因。没关系,谢谢。我已经看过说明书了。而且,我想知道这两种情况的区别。@Nicksilion我已经编辑了我的答案,以解决字段和局部变量之间的差异故障区域设置:检查ranjeet的答案。如果静态块不是按顺序编译的,那么它们是按什么顺序编译的。应该有一些顺序,对吧?你们在编辑我的问题,我在写编译器产生的确切错误(记住案例)。您正在编辑它们。@Nicksilion的编号和顺序不一定定义。这可能是一个实现细节。不管怎样,我认为这不重要,我已经读过说明书了。而且,我想知道这两种情况的区别。@Nicksilion我已经编辑了我的答案,以解决字段和局部变量之间的差异故障区域设置:检查ranjeet的答案。如果静态块不是按顺序编译的,那么它们是按什么顺序编译的。应该有一些顺序,对吧?你们在编辑我的问题,我在写编译器产生的确切错误(记住案例)。您正在编辑它们。@Nicksilion的编号和顺序不一定定义。这可能是一个实现细节。不管怎样,我认为这不重要,哈哈。你是如何得到优化代码的?什么是Test3()?好的,现在它是正确的。首先,您如何知道哪些代码将被优化?其次,告诉我我的第一个带有静态块的代码的优化版本。优化后的代码只是一个表示,java没有透露他们是如何优化代码的。因此,根据您的说法,优化后的代码将在顶部有静态声明,即在静态块之前。那么,为什么会出错呢?哈哈。你们是如何得到优化的代码的?什么是Test3()?好的,现在它是正确的。首先,您如何知道哪些代码将被优化?其次,告诉我我的第一个带有静态块的代码的优化版本。优化后的代码只是一个表示,java没有透露他们是如何优化代码的。因此,根据您的说法,优化后的代码将在顶部有静态声明,即在静态块之前。那么,为什么会变成错误呢?
class Test {
    static {
        System.out.println(x);
    }
    static int x = 6;
    static double z;
}
class Test {
    public static void main(String[] args) {
        System.out.println(z);
        int z = 8;
    }
}
class Test {
    private void setXToTen() {  // legal
        x = 10;
    }

    static int x;
    ....
static {
    x = 10; //this works
}
static int x;

static {
    z = y; //illegal forward reference error.
}
static int y;
static int z;
static {
    z = banana; //cannot find symbol
}
static int y;
static int z;
static {
    y = 100;
    z = 200; 
}
static int y;
static int z;
static {
     z = 2*y; //illegal forward reference
}
static int y;
static int z;
public class Test
{
    static
        {
            x = 10;
        }

    static int x;

    public static void main(String[] args)
        {
            System.out.println("Program starts..");
            System.out.println("Program ends..");
        }

    static int y;
    static
        {
            y = 20;
        }
}
public class Test
{
    static int x,y;
    static
        {
            x = 10;
        }
    static
    {
         y = 20;
    }
    public Test()
        {
            super();
        }
    public static void main(String[] args)
        {
            System.out.println("Program starts..");
            System.out.println("Program ends..");
        }
}