runtime在运行.class文件时,每个作用域(方法、接口、类等带语言元素都有自己的作用域)的符号表都会被至少访问两次,第一次会将所有的字段(这里只考虑类的初始化)放到符号表中,暂时不考虑初始化只,放到符号表中只是相当于一个索引,好让其他地方引用该字段时可以找到它们
1
2
3
4
5
6
7
8
|
class
MyClass
{
void
method()
{
System.out.println(myvar);
}
String myvar =
"var value"
;
}
|
1
2
3
4
5
|
class
MyClass {
int
method() {
return
n; }
int
m = method();
int
n =
1
;
}
|
1
|
System.out.println(
new
MyClass().method());
|
1
|
System.out.println(
new
MyClass().m);
|
1
2
3
4
5
|
class
MyClass {
int
method() {
return
n; }
int
n =
1
;
int
m = method();
}
|
1
|
System.out.println(
new
MyClass().m);
|
1
2
3
|
MyClass myClass =
new
MyClass();
System.out.println(myClass.n);
// 输出1
System.out.println(myClass.m);
// 仍然输出0
|
1
2
3
4
5
|
class
MyClass {
static
int
method() {
return
n; }
static
int
m = method();
// 直接访问m,仍然会输出0
static
int
n =
1
;
}
|