访问变量
为什么不下面的程序返回,因为我从新的A(),它一直没有主要调用它访问p?访问变量
public class A {
public static int p = 0;
public static void main(String[] args) {
p = Integer.parseInt(args[0]);
new B().go();
}
}
class B {
public void go() {
System.out.println(new A().p);
}
}
这甚至不应该编译。
也许你有p
静态和比你改变它。它现在写的方式不会编译。
$ javac A.java
A.java:7: non-static variable p cannot be referenced from a static context
p = Integer.parseInt(args[0]);
^
1 error
编辑
现在,你已经改正你的代码的答案是:
这个程序不打印因为你看到的价值是什么在第7行中分配。在这种情况下,p
是一个类变量。
p = Integer.parseInt(args[0]);
所以,当你执行:
System.out.println(new A().p);
,你希望看到0
思考“新A”将有它自己的p
副本,但事实并非如此。
这应该不会编译,因为您试图从静态方法分配实例成员。
该程序不编译。编译器不会让你从类A的主要方法中访问'p'。你不能从静态上下文中访问非静态变量。因此编译问题
即使您将变量'p'定义为静态,仍然存在运行时异常'Exception在线程“main”java.lang.ArrayIndexOutOfBoundsException:0' – Thunderhashy 2010-05-18 23:45:05
可能是因为你不用参数调用代码? – 2010-05-18 23:52:11
这不会编译原样,所以我不知道它将如何返回任何东西。
变量p不能从静态上下文访问是它应该说的。
如果您设置了p的一个实例,它应该可以正常工作。
ps。对于这一个实验,我会让你有一个公共的非最终成员变量,但永远不会!
编辑:这只是一个基于问题的第一次修订,其中假设p是非静态的猜测。事实证明,它的意图是它是静态的,所以这得到了棒的错误结局。
尽管编译器错误,我认为你的意图是从非静态方法来初始化P,或A的一个实例
的问题是,然后你是B中创造的一个新实例,而不是使用原始实例。
得到什么(我相信)你想,做这样的事情
public class A {
public int p = 0;
public static void main(String[] args) {
A a = new A();
a.p = Integer.parseInt(args[0]);
new B().go(a);
}
}
class B {
public void go(A a) {
System.out.println(a.p);
}
}
注意,在B中的go()方法需要一个作为参数。没有创建A的新实例。
什么是输出?任何错误? – 2010-05-18 23:39:58
这不会编译,p是一个成员变量,main是一个静态方法 – karoberts 2010-05-18 23:40:44
请尝试发布这里似乎有效的问题。我想你甚至没有试图检查程序是否会先编译。 – Thunderhashy 2010-05-18 23:46:32