类中对象的初始化

时间:2021-10-19 19:50:09
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前面就能通过编译了

#2



int q=g;
int g=10;

 在执行第一句的时候,找不到变量g,因为g还没有定义。 java 是static language,就是要先定义,再赋值。定义了什么类型就是什么类型,没法像PHP那样动态改变(dynamic)。 
不知道楼主是不是这个意思呢。

#3


电脑很死板的,不会这里看没有g,然后往后面看看有没有声明,所以就算初始化类,他也是按行顺序一个个初始化下来的

#4


引用 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前面就能通过编译了

+1

#5


js里面可能出现这样的情况,但是在java里面就不行了哦,楼主不要把地方搞错了,楼上的分析ok!

#6


引用 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前面就能通……


+1

#7


对,是顺序解释执行的

#8


引用 6 楼  的回复:
引用 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前……

+1

#9


楼上都只将了编译,没有深入讲编译和运行。。。

#10


+1
引用 8 楼  的回复:
引用 6 楼  的回复:

引用 1 楼  的回复:

int i=get();
//    int q=g;
int g=10;
Scanner t=new Scanner("aaa");

编译器是顺序解释下来的,你int i=get(),他执行到这一步时就跳到get()方法这里,正常运行赋值再执行下一步你的int q=g;
这时候你的g还没有声明,所以报错。
你把in……

#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前面就能通过编译了

#2



int q=g;
int g=10;

 在执行第一句的时候,找不到变量g,因为g还没有定义。 java 是static language,就是要先定义,再赋值。定义了什么类型就是什么类型,没法像PHP那样动态改变(dynamic)。 
不知道楼主是不是这个意思呢。

#3


电脑很死板的,不会这里看没有g,然后往后面看看有没有声明,所以就算初始化类,他也是按行顺序一个个初始化下来的

#4


引用 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前面就能通过编译了

+1

#5


js里面可能出现这样的情况,但是在java里面就不行了哦,楼主不要把地方搞错了,楼上的分析ok!

#6


引用 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前面就能通……


+1

#7


对,是顺序解释执行的

#8


引用 6 楼  的回复:
引用 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前……

+1

#9


楼上都只将了编译,没有深入讲编译和运行。。。

#10


+1
引用 8 楼  的回复:
引用 6 楼  的回复:

引用 1 楼  的回复:

int i=get();
//    int q=g;
int g=10;
Scanner t=new Scanner("aaa");

编译器是顺序解释下来的,你int i=get(),他执行到这一步时就跳到get()方法这里,正常运行赋值再执行下一步你的int q=g;
这时候你的g还没有声明,所以报错。
你把in……

#11


这种a初始值依赖于b的初始值时应将a的初始化放在构造中进行,构造运行时默认值已赋。