我不明白Oracle文档中的这一部分?

时间:2013-12-12 12:06:17

标签: java

您好我是Ankur并且已经使用java编写了几年的篇幅。我已经阅读过Herbert Schildt先前的Java头部完整参考资料,最近我在Oracle docs的这个页面中遇到了一个主要的谬误。注释部分说明如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题。但是,如果我明确地没有提到超类中的默认构造函数,我仍然没有得到错误!我从未在所提到的任何一本书中找到这样的信息!!实际上我可以很容易地运行一个程序来展示构造函数链而不提供默认值超类构造函数!!这是代码:

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()构造函数,然后是工程()然后是计算机()..但是当我删除默认构造函数时基类student(),它仍然成功运行..在oracle文档中的参数不是在构造函数链接期间必须提供超类中的默认构造函数错误或者我对oracle文档中此部分的理解错误吗?请帮助我解决这个问题!! 谢谢!

4 个答案:

答案 0 :(得分:2)

编译器还将默认构造函数添加到任何未声明任何类的类中。如果你的超类声明了除默认构造函数之外的另一个构造函数,并且如果你注释掉默认构造函数,那么你将得到编译器错误。

答案 1 :(得分:0)

在您的示例中,如果类Student没有任何构造函数,则使用默认的no-param构造函数,因此代码确实运行没有问题。

答案 2 :(得分:0)

除非您定义另一个构造函数,否则编译器不会自动生成参数构造函数。

因此,在使用student类的情况下,没有自动插入参数构造函数,因为您没有提供任何其他构造函数。

答案 3 :(得分:0)

如果你没有提供no-arg构造函数,那么只要没有定义其他构造函数,compile就会为你提供一个。因此,在您的示例中,如果您注释掉student()构造函数,编译器将插入no-arg student()构造函数。