访问其他类中的变量(Java)

时间:2010-05-18 23:36:54

标签: java class

为什么以下程序不会返回 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);
            }
        }

5 个答案:

答案 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实例。