文章目录
写在前面01 | 题目Foo:通过编译。Foo2:编译失败。Foo3:编译失败。Foo4:编译成功。Foo5:编译成功。Foo6:编译成功。
写在前面
《Head First Java》数字与静态一章中,有如下练习题,特写此篇加深印象。
01 | 题目
请问下面哪个程序可以通过编译?
Foo:通过编译。
原因:非静态方法能够调用静态变量。
public class Foo{
static int x
;
public void go(){
System
.out
.println(x
);
}
public static void main(String
[] args
){
}
}
Foo2:编译失败。
原因:静态方法不能调用非静态变量。
public class Foo2{
int x
;
public static void go(){
System
.out
.println(x
);
}
public static void main(String
[] args
){
}
}
Foo3:编译失败。
原因:非静态方法能够存取final变量,但是此题中final变量没有初始化,因此编译失败。
public class Foo3{
final int x
;
public void go(){
System
.out
.print(x
);
}
public static void main(String
[] args
){}
}
final变量初始化的两种方法:
声明时初始化
public class Foo3{
final int x
= 0;
public void go(){
System
.out
.print(x
);
}
在静态初始化程序中初始化:
public class Foo3{
final int x
;
static {
x
= 0;
}
}
Foo4:编译成功。
原因:非静态方法中可以存取静态 static变量和final变量
public class Foo4{
static final int x
= 12;
public void go(){
System
.out
.print(x
);
}
}
Foo5:编译成功。
原因:非静态方法参数中的final变量能被该方法存取。
public class Foo5{
static final int x
= 12;
public void go(final int x
){
System
.out
.print(x
);
}
public static void main(String
[] args
){
Foo5 foo
= new Foo5();
foo
.go(5);
}
}
Foo6:编译成功。
原因:静态方法参数中的final变量能被该方法存取。
public class Foo6{
int x
= 12;
public static void go(final int x
){
System
.out
.println(x
);
}
public static void main(String
[] args
){
Foo6 foo
= new Foo6();
foo
.go(5);
}
}