我正在阅读Kathy和Bert SCJP 1.6并遇到以下代码:
class Bar {
int barNum = 28;
}
class Foo {
Bar myBar = new Bar();
void changeIt(Bar myBar) {
myBar.barNum = 99;
System.out.println("myBar.barNum in changeIt is " + myBar.barNum);
myBar = new Bar();
myBar.barNum = 420;
System.out.println("myBar.barNum in changeIt is now " + myBar.barNum);
}
public static void main (String [] args) {
Foo f = new Foo();
System.out.println("f.myBar.barNum is " + f.myBar.barNum);
f.changeIt(f.myBar);
System.out.println("f.myBar.barNum after changeIt is "
+ f.myBar.barNum);
}
}
虽然它是阴影变量的主题,但我无法理解如何在main()方法(静态)中引用非静态变量myBar?
答案 0 :(得分:5)
诀窍是myBar
访问的上下文不是静态的。
通过编写f.myBar
而不仅仅是myBar
,您可以在f
(局部变量)中存储的实例的上下文中访问它。
这是常用模式启动应用程序的基础。
public class Main {
private final Foo param1;
private final Bar param2;
private Main( Foo initParam1, Bar initParam2 ) {
//initialise the fields
}
private void run() {
// execute the application
}
public static void main( String [] args ) {
// parse the command line arguments
Foo parsedParam1 = ...
Bar parsedParam2 = ...
Main main = new Main( parsedParam1, parsedParam2 );
main.run();
}
}
答案 1 :(得分:3)
static
变量属于Class
,其值对于该类的所有实例保持相同。
将类加载到JVM 时,初始化{{1>}变量。
另一方面,实例变量对每个实例具有不同的值。它们是在使用static
运算符或使用new
之类的反射创建对象实例时创建的。所以在你的情况下:
Class.newInstance()
因此,如果您尝试访问非静态变量而没有任何实例编译器会给您一个错误,因为这些变量尚未创建,因此不存在。