为什么以下程序不会返回 0 ,因为我从新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);
}
}
答案 0 :(得分:2)
甚至不应该编译。
可能你有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
击> <击> 撞击>
修改强>
现在您已经更正了代码,答案是:
此程序不会打印 0 ,因为您看到的是第7行中指定的值。在这种情况下,p
是一个类变量。
p = Integer.parseInt(args[0]);
所以当你执行:
System.out.println(new A().p);
您希望看到0
认为“新A”会拥有自己的p
副本,但事实并非如此。
答案 1 :(得分:0)
这甚至不应该编译,因为你试图从静态方法中分配一个实例成员。
答案 2 :(得分:0)
此程序无法编译。编译器不允许您从类A的main方法中访问“p”。您无法从静态上下文中访问非静态变量。因此编译问题
答案 3 :(得分:0)
这不会按原样编译,因此我不知道它会如何返回任何内容。
无法从静态上下文访问变量p是它应该说的。
如果设置p的实例,它应该可以正常工作。
PS。对于这个实验,我会让你有一个公共的非最终成员变量,但永远不会再来!
答案 4 :(得分:0)
编辑:这只是基于问题的第一个修订版的猜测,假设p是非静态的。事实证明,它的意图是它是静态的,所以这会得到错误的结束。
尽管存在编译器错误,但我认为您的意图是从非静态方法或A实例初始化p。
问题是你在B中创建一个新的A实例,而不是使用原始实例。
为了获得你想要的东西,我会做点什么,比如
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作为参数。没有创建新的A实例。