访问变量

问题描述:

为什么不下面的程序返回,因为我从新的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

什么是输出?任何错误? – 2010-05-18 23:39:58

+0

这不会编译,p是一个成员变量,main是一个静态方法 – karoberts 2010-05-18 23:40:44

+0

请尝试发布这里似乎有效的问题。我想你甚至没有试图检查程序是否会先编译。 – Thunderhashy 2010-05-18 23:46:32

这甚至不应该编译。

也许你有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副本,但事实并非如此。

+0

好的电话。在原始代码中,p是静态的。这可能解决了这个问题。 – George 2010-05-18 23:44:08

+0

我想删除这个问题,但我不能。 – George 2010-05-18 23:49:21

+0

@George:如果你用'0'作为参数运行它,它打印'0';) – 2010-05-18 23:49:29

这应该不会编译,因为您试图从静态方法分配实例成员。

该程序不编译。编译器不会让你从类A的主要方法中访问'p'。你不能从静态上下文中访问非静态变量。因此编译问题

+0

即使您将变量'p'定义为静态,仍然存在运行时异常'Exception在线程“main”java.lang.ArrayIndexOutOfBoundsException:0' – Thunderhashy 2010-05-18 23:45:05

+0

可能是因为你不用参数调用代码? – 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的新实例。