访问其他类中的变量(Java)
为什么下面的程序不返回0,因为我正在从一个新的a()访问p,而该a()没有调用main访问其他类中的变量(Java),java,class,Java,Class,为什么下面的程序不返回0,因为我正在从一个新的a()访问p,而该a()没有调用main public class A { public static int p = 0; public static void main(String[] args) { p = Integer.parseInt(args[0]); new B().go(); }
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
编辑
现在您已经更正了代码,答案是:
此程序不打印0,因为您看到的是第7行中指定的值。在这种情况下,p
是一个类变量
p = Integer.parseInt(args[0]);
因此,当您执行时:
System.out.println(new A().p);
你希望看到
0
认为“新A”将拥有自己的p
副本,但事实并非如此 此程序无法编译。编译器不允许您从类A的主方法中访问“p”。您不能从静态上下文中访问非静态变量。因此,编译问题将不会按原样编译,因此我不知道它将如何返回任何内容
变量p不能从静态上下文访问,这是它应该说的
如果您设置了p的实例,它应该可以正常工作
对于这一个实验,我会让你有一个公共的非最终成员变量,但再也不会了 EDIT:这只是基于问题的第一次修订的猜测,假设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作为参数。没有创建新的实例。输出是什么?有错误吗?这将无法编译,p是一个成员变量,main是一个静态方法。请尝试在这里发布有效的问题。我想你甚至没有试着检查程序是否会首先编译。在原始代码中,p是静态的。这可能解决了问题。我想删除这个问题,但我不能。乔治:如果你以
0
作为参数运行它,它会打印0
;)那样的话。。mhhh nevermind:P你可以随时将我的答案标记为已接受,我将投票结束它。谢谢。因此,关键是单词“static”(具有讽刺意味的是,这是我粘贴代码时必须删除的一个单词!)即使将变量“p”定义为静态,线程“main”java.lang.ArrayIndexOutOfBoundsException中仍然存在运行时异常异常0