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

Java LinkedList的源代码中有空构造函数,java,Java,下面我写的关于jdk-8u111中LinkedList.java的内容正确吗 我们可以看到构造函数中不存在代码,并且 这种奇怪的构造函数适用于以后的子类。我们知道 编译器将自动向 如果构造函数没有显式的super() 呼叫如果父类没有这样的错误,编译器将报告错误 没有参数构造函数 Error:(x, y) java: no suitable constructor found for parent class(no arguments) 我们可以得出结论,LinkedList的空构造函数是供子

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

我们可以看到构造函数中不存在代码,并且 这种奇怪的构造函数适用于以后的子类。我们知道 编译器将自动向 如果构造函数没有显式的
super()
呼叫如果父类没有这样的错误,编译器将报告错误 没有参数构造函数

Error:(x, y) java: no suitable constructor found for parent class(no arguments)
我们可以得出结论,
LinkedList
的空构造函数是供子类使用的


不,这与子类无关

如果您没有定义任何构造函数,那么Java将自动添加一个默认构造函数。但是,如果定义了其他构造函数,则必须写出默认构造函数。因为此构造函数存在:

LinkedList(Collection<? extends E> c);

如果我没有写出一个显式的空默认构造函数,它就可以工作并且没有错误。编译器执行成功。所以不写出来没关系吧?如果我们已经有了另一个构造函数,那么需要写出什么呢

  • 在没有构造函数的情况下,会添加一个默认构造函数,我们可以成功调用
    newthing()

  • 添加了非默认构造函数后,Java不再单独添加默认构造函数。现在
    newthing()
    是一个错误

    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();
    

    • 不,这与子类无关

      如果您没有定义任何构造函数,那么Java将自动添加一个默认构造函数。但是,如果定义了其他构造函数,则必须写出默认构造函数。因为此构造函数存在:

      LinkedList(Collection<? extends E> c);
      

      如果我没有写出一个显式的空默认构造函数,它就可以工作并且没有错误。编译器执行成功。所以不写出来没关系吧?如果我们已经有了另一个构造函数,那么需要写出什么呢

      • 在没有构造函数的情况下,会添加一个默认构造函数,我们可以成功调用
        newthing()

      • 添加了非默认构造函数后,Java不再单独添加默认构造函数。现在
        newthing()
        是一个错误

        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();
        

      你好约翰:非常感谢,我现在已经说清楚了。写出默认构造函数是为了帮助初始化一个带有非参数的新对象。但是如果我们总是使用其他构造函数而不是默认构造函数,则默认构造函数不能使用,并且可以删除。进一步说,没有默认构造函数将导致其子类必须显式调用带参数的super(),因为编译器为该子类提供的super()会报告错误,而super()是用非参数修复的。您好John:非常感谢,我现在已经讲清楚了。写出默认构造函数是为了帮助初始化一个带有非参数的新对象。但是如果我们总是使用其他构造函数而不是默认构造函数,则默认构造函数不能使用,并且可以删除。此外,没有默认构造函数将导致其子类必须显式调用带参数的super(),因为编译器为该子类提供的super()将报告错误,而super()是用非参数修复的。