This question already has answers here:
Why Java doesn't provide default constructor, if class has parametrized constructor? [duplicate]
                                
                                    (4个答案)
                                
                        
                去年关闭。
            
        

换句话说,即使Java编译器提供了默认构造函数,即使存在带有args的构造函数,也会有什么问题呢?

最佳答案

一般而言,如果不提供任何参数,Java将提供无参数的构造函数。

如果您有一个“ arg”构造函数,并且不尝试使用no-arg构造函数(或定义一个),则没有问题。

但是,Java序列化库要求您有一个无参数的构造函数,因此它知道在反序列化对象时如何创建对象。

我在我的库中采取的另一种方法是调用no-arg构造函数(如果存在),或者仅创建对象而不调用它的构造函数(如果不存在)。如果您不调用构造函数,则可能会产生字段未初始化的副作用。例如

class MyClass {
    // only set if you call a constructor!
    transient final List<String> list = new ArrayList<>();
    int a;

    MyClass(int a) { this.a = a; }
}


在这种情况下,没有no-arg构造函数意味着很难知道如何正确反序列化它。

07-24 09:45
查看更多