java - 为什么我在 Java 代码中得到两个不同的输出

标签 java oop object inner-classes

class A {
    int xyz = new B().show(); // prints c=0 and z=null
    int c = -319;
    B z = new B();
    int lmn = z.show(); // prints c=-319

    class B {
        int show() {
            System.out.println("c=" + c);
            System.out.println("z=" + z);
            return -555;
        }
    }
}

class C {
    public static void main(String args[]) {
        A p = new A();
    }
}

为什么我一开始得到 c=0 ,然后又得到 c=-319 。同样,为什么 z null 最初和之后不是 null。代码中发生了什么?

最佳答案

您需要知道 new 运算符负责创建类的实例(实例的字段将具有默认值:numeric:0; boolean 值:false,char:'\0',引用:null)。 new 完成工作后调用构造函数代码,并负责为此类空对象设置正确的状态。

现在字段的初始化发生在构造函数中,所以你的代码

class A {
    int xyz = new B().show(); // prints c=0 and z=null
    int c = -319;
    B z = new B();
    int lmn = z.show(); // prints c=-319

    class B {
        int show() {
            System.out.println("c=" + c);
            System.out.println("z=" + z);
            return -555;
        }
    }
}

与(注意默认值)相同

class A {

    int xyz = 0;    //default values
    int c = 0;      //
    B z = null;     //
    int lmn = 0;    //

    A(){
        xyz = new B().show(); 
        c = -319;
        z = new B();
        lmn = z.show(); 
    }
    class B {
        int show() {
            System.out.println("c=" + c);
            System.out.println("z=" + z);
            return -555;
        }
    }
}

还有

xyz = new B().show();

相同
xyz = this.new B().show();

这样创建的 B 实例将可以访问在当前 A 构造函数中初始化的 A 实例。但是初始化 bz

的代码
int c = -319;
B z = new B();

发生在您的第一个 show() 方法(使用 bz)之后,这意味着将显示它们的默认值。

第二个show()不存在这个问题

lmn = z.show(); 

因为现在 bz 都被初始化了。

关于java - 为什么我在 Java 代码中得到两个不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29317289/

相关文章:

java - 手动设置日期和时间 - java

c# - 如何比较同一类的两个对象?

javascript - 搜索 2 个字符串中的占位符值

javascript - 如何获取 JavaScript 对象的大小?

powershell - PowerShell-如何判断两个对象是否相同

java - 背景颜色不变

java - GridBagLayout 格式错误。 JTextFields 位置错误

javascript - 封装在 Javascript 中

c# - 幕后的new和override到底发生了什么?

java - 类别上的 SLF4J log4j NoSuchMethodError