为啥 println() 打印这个?

Posted

技术标签:

【中文标题】为啥 println() 打印这个?【英文标题】:Why does println() print this?为什么 println() 打印这个? 【发布时间】:2015-02-14 17:20:58 【问题描述】:

打印出以下代码:

-7
-7
11 44 -54
11

我认为应该打印出来:

-7
-7
-11 -44 -54
11

代码是:

import static java.lang.System.out;

public class Point 
    public static int x = 0;
    public int y = 0;
    public static int i = 7;
    public static void main(String[] args) 
        if (true) Point.x = -7;
        out.println(x);
        out.println(Point.x);
        Point foo = new Point(-11,-44,-54);
        Point bar = new Point(11,44,54);
            out.println(foo.x + " " + foo.i + " " + foo.y);
        out.println(Point.x);
    

    //constructor
    public Point(int x, int i, int y) 
        this.y = y;
        this.i = i;
        this.x = x;
    

如果我删除Point bar = new Point(11,44,54); ,输出是:

-7
-7
-11 -44 -54
11

如果这是相关的:要运行这个程序(在 Point.java 中),我(像往常一样)按 Shift+Ctrl+F9 和 Ctrl+F9 和 Shift+F10。我在安装了所有更新的 Win 8.1 64 位上运行带有 JDK 7u76 的 IntelliJ Idea 14.0.3。

【问题讨论】:

【参考方案1】:

因为xstatic:对于Point 类的所有实例,只有一个x 实例是“共享”的。这就是该值被覆盖的原因。事实上,x 不与任何对象相关联,而是与类本身相关联。请注意,变量y 不是这种情况,它是一个实例变量

所以在下面的代码中:

Point foo = new Point(-11,-44,-54);
Point bar = new Point(11,44,54);

x 设置为 -11,然后设置为 11

【讨论】:

我还不明白。为什么打印出foo的整数会显示bar的整数? @AppTime 没有foo 的整数或bar 的整数这样的东西。整数xPoint 类型的所有 对象之间“共享”。这就是该值被覆盖的原因。这是因为x 是静态的,不像y 这也是i 的解释,即Point.i 在ctor 中被赋值this.i = i 覆盖。不幸的是,该语言允许通过实例访问静态字段。体面的编译器对此发出警告。

以上是关于为啥 println() 打印这个?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 main 方法不打印任何东西?

为啥代码不能打印这个二维数组的元素?

为啥这个程序打印“fork”! 4次?

为啥 foreach 没有给驱动程序带来任何东西?

为啥这个方法打印出 347 而不是 3?

java为啥需要finally?