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