Java LinkedList的源代码中包含空的构造函数

时间:2019-03-08 03:27:32

标签: java

我在下面写的关于jdk-8u111中LinkedList.java的内容正确吗?

/**
 * Constructs an empty list.
 */
public LinkedList() {
}
     

我们可以看到构造函数中不存在任何代码,并且   这样一个奇怪的构造函数是用于以后的子类的。我们知道   编译器会自动提供一个无参数super()来   子类构造函数(如果该构造函数没有显式的super())   呼叫。如果父类没有此类,编译器将报告错误。   无参数构造函数。

Error:(x, y) java: no suitable constructor found for parent class(no arguments)
     

我们可以得出结论,LinkedList的空构造函数供子类使用。

1 个答案:

答案 0 :(得分:4)

不,这与子类无关。

如果您未定义任何构造函数,则Java将自动添加默认的构造函数。但是,如果确实定义其他构造函数,则必须写出默认构造函数。因为此构造函数存在:

LinkedList(Collection<? extends E> c);

必须明确定义默认构造函数:

LinkedList();

  

如果我不写出一个显式的空默认构造函数,它将起作用并且没有错误。编译器成功执行。所以可以不写出来吗?如果我们已经有了另一个构造函数,需要写出来吗?

  • 没有构造函数,将添加一个默认构造函数,我们可以成功调用new Thing()

    class Thing {
    }
    
    Thing t = new Thing();
    
  • 添加了非默认构造函数后,Java不再自行添加默认构造函数。现在new Thing()是一个错误。

    class Thing {
        public Thing(int foo) { }
    }
    
    Thing t = new Thing();
    

    结果:

    Test.java:7: error: constructor Thing in class Thing cannot be applied to given types;
            Thing t = new Thing();
                      ^
      required: int
      found: no arguments
      reason: actual and formal argument lists differ in length
    1 error
    
  • 我们必须写出默认的构造函数才能编译代码:

    class Thing {
        public Thing() { }
        public Thing(int foo) { }
    }
    
    Thing t = new Thing();