import java.util.Scanner;
public class FieldIniSequence {
int i=get();
// int q=g;
int g=10;
Scanner t=new Scanner("aaa");
private int get() {
System.out.println(g+"\n"+t);
return 10;
}
public static void main(String[] args){
FieldIniSequence f=new FieldIniSequence();
}
}
标注地方是无法通过JAVA的编译器的,但是第一行int i=get();可以通过编译
在看了书之后我的理解是:
在运行的时候,JAVA先为所有对象分配空间,设置为默认值,再对其赋值
但是为了防止意外的赋值错误(比如说你的q不想为0的其实,想被赋值成10),编译的时候把你报错了。
不知大家意见如何啊,言之有理就有分。。
11 个解决方案
#1
int i=get();
// int q=g;
int g=10;
Scanner t=new Scanner("aaa");
编译器是顺序解释下来的,你int i=get(),他执行到这一步时就跳到get()方法这里,正常运行赋值再执行下一步你的int q=g;
这时候你的g还没有声明,所以报错。
你把int g=10写在int q=g前面就能通过编译了
// int q=g;
int g=10;
Scanner t=new Scanner("aaa");
编译器是顺序解释下来的,你int i=get(),他执行到这一步时就跳到get()方法这里,正常运行赋值再执行下一步你的int q=g;
这时候你的g还没有声明,所以报错。
你把int g=10写在int q=g前面就能通过编译了
#2
int q=g;
int g=10;
在执行第一句的时候,找不到变量g,因为g还没有定义。 java 是static language,就是要先定义,再赋值。定义了什么类型就是什么类型,没法像PHP那样动态改变(dynamic)。
不知道楼主是不是这个意思呢。
#3
电脑很死板的,不会这里看没有g,然后往后面看看有没有声明,所以就算初始化类,他也是按行顺序一个个初始化下来的
#4
+1
#5
js里面可能出现这样的情况,但是在java里面就不行了哦,楼主不要把地方搞错了,楼上的分析ok!
#6
+1
#7
对,是顺序解释执行的
#8
+1
#9
楼上都只将了编译,没有深入讲编译和运行。。。
#10
+1
#11
这种a初始值依赖于b的初始值时应将a的初始化放在构造中进行,构造运行时默认值已赋。
#1
int i=get();
// int q=g;
int g=10;
Scanner t=new Scanner("aaa");
编译器是顺序解释下来的,你int i=get(),他执行到这一步时就跳到get()方法这里,正常运行赋值再执行下一步你的int q=g;
这时候你的g还没有声明,所以报错。
你把int g=10写在int q=g前面就能通过编译了
// int q=g;
int g=10;
Scanner t=new Scanner("aaa");
编译器是顺序解释下来的,你int i=get(),他执行到这一步时就跳到get()方法这里,正常运行赋值再执行下一步你的int q=g;
这时候你的g还没有声明,所以报错。
你把int g=10写在int q=g前面就能通过编译了
#2
int q=g;
int g=10;
在执行第一句的时候,找不到变量g,因为g还没有定义。 java 是static language,就是要先定义,再赋值。定义了什么类型就是什么类型,没法像PHP那样动态改变(dynamic)。
不知道楼主是不是这个意思呢。
#3
电脑很死板的,不会这里看没有g,然后往后面看看有没有声明,所以就算初始化类,他也是按行顺序一个个初始化下来的
#4
+1
#5
js里面可能出现这样的情况,但是在java里面就不行了哦,楼主不要把地方搞错了,楼上的分析ok!
#6
+1
#7
对,是顺序解释执行的
#8
+1
#9
楼上都只将了编译,没有深入讲编译和运行。。。
#10
+1
#11
这种a初始值依赖于b的初始值时应将a的初始化放在构造中进行,构造运行时默认值已赋。