用 null 初始化对象或它的默认构造函数之间的区别

ham*_*d_c 2 java null constructor

让我们假设我们有一个 Class,它只包含一个实例变量它的类型是引用类型。我们没有实现任何构造函数,所以 Class 有它的默认构造函数。

如果我理解正确,默认构造函数会为实例变量提供默认值,而引用类型的默认值为 null。真的吗?

如果是,我们要创建这个类的对象。这两个声明和初始化这个类的对象的语句有什么区别吗?

Class object = null;
Run Code Online (Sandbox Code Playgroud)

Class object = new Class();
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

这两个声明和初始化这个类的对象的语句有什么区别吗???

Class object = null;
Run Code Online (Sandbox Code Playgroud)

Class object = new Class();
Run Code Online (Sandbox Code Playgroud)

第一个初始化类的对象,它只是声明一个变量并分配null给它。没有实例,因此没有实例字段。

第二个初始化类的实例,因此初始化它具有的任何实例字段。如果这些字段中的任何一个是引用,并且您尚未实现构造函数,则它们将被初始化为null.

让我们使用一个具体的例子:

class Foo {
    String str;
}
Run Code Online (Sandbox Code Playgroud)

由于str是一个引用,如果我们创建 的实例Foostr将被初始化为null

您的第一条语句(更改Class=>Fooobject=>f以避免混淆):

Foo f = null;
Run Code Online (Sandbox Code Playgroud)

...在内存中的结果:

+----------------+
| f(变量)|
+----------------+
| 空|
+----------------+

你的第二个陈述:

Foo f = new Foo();
Run Code Online (Sandbox Code Playgroud)

...给了我们一些非常不同的东西:

+----------------+
| f(变量)|
+----------------+ +--------------+
| (ref #412785) |---->| Foo 实例 |
+----------------+ +--------------+
                       | 字符串:空|
                       +--------------+