嗨,我是Ankur,并且已经使用Java进行编码了几年。.我早些时候读过Herbert Schildt撰写的Head first Java The Complete Reference,最近在Oracle文档的这一页中遇到了一个重大谬误。注释部分说,如果构造函数未显式调用超类构造函数,则Java编译器会自动将调用插入到超类的无参数构造函数中。如果超类没有无参数构造函数,则将出现编译时错误。对象确实具有这样的构造函数,因此如果对象是唯一的超类,就没有问题。但是,如果我在超类中没有明确提及默认构造函数,我仍然不会出错!我从未在所提到的两本书中找到这样的信息!事实上,我可以轻松地运行显示构造函数链接的程序而无需提供默认值超类构造函数!这是代码:
import java.io.*; import java.util.*; class student { // student() //{ //System.out.println("I am student\n"); // } public void subjects() { System.out.println("English.."); } } class engineering extends student { engineering() { System.out.println("I am an engineer..\n"); } public void subjects() { System.out.println("Maths"); } } class computer extends engineering { computer() { System.out.println("I am a computer engineer."); } public void subjects() { System.out.println("Computer"); } } class test8 { public static void main(String args[]) { computer cs=new computer(); } }
在上面的代码中,如果我使用注释的代码块运行它,则构造函数链接通常会发生。首先是Student()构造函数运行,然后是engineering()然后是computer()..但是当我删除基本的默认构造函数时类Student(),它仍然可以成功运行。.oracle文档中的论点不是在构造函数链接期间必须提供超类中的默认构造函数是错误的,还是我对oracle docs中对本节的理解是错误的?请帮助我这个不一致!谢谢!
编译器还将默认构造函数添加到任何未声明任何内容的类中。如果您的超类声明了除默认构造函数之外的另一个构造函数,然后注释掉了默认构造函数,则会出现编译器错误。