【问题标题】:I don't understand this part in Oracle docs?我不理解 Oracle 文档中的这一部分?
【发布时间】:2013-12-12 20:14:25
【问题描述】:

嗨,我是 Ankur,已经使用 java 编码好几年了。我之前读过 Herbert Schildt 的 Head first Java The Complete Reference,最近我在 Oracle docs 的这个页面中遇到了一个重大谬误。注释部分说如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。如果超类没有无参数构造函数,则会出现编译时错误。 Object 确实有这样的构造函数,所以如果 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() 构造函数运行,然后是 engineering(),然后是 computer()。但是当我删除默认构造函数时基类student(),它仍然成功运行..oracle docs中的参数不是在构造函数链接期间必须在超类中提供默认构造函数错误还是我对oracle docs中这一部分的理解错误?请帮我解决这种不一致! 谢谢!

【问题讨论】:

  • 请正确缩进并使用Java命名约定,类名以大写开头。
  • 你会在SO post得到答案

标签: java


【解决方案1】:

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

【讨论】:

  • 你发这个帖子只比我快 32 秒。 =D +1 快速响应。
  • 您好,Topolnik 先生,我没有收到编译器错误,我的意思是文档说如果没有默认构造函数我会收到错误!
  • 有一个默认构造函数。编译器为您提供它。即使你从未见过它,它也在那里。但是,如果您定义了其他构造函数,编译器将不会提供默认构造函数。我认为最后一点是文档所指的。
  • 如果你没有定义一个默认的构造函数,Java magic 会添加它。如果你定义了一个参数化的构造函数和一个默认的构造函数并把它注释掉,你会得到编译器错误
  • 我明白他为什么会困惑,几年前我也有过这种困惑。但我希望现在 Ankur 的答案很清楚。
【解决方案2】:

在您的示例中,如果类Student 没有任何构造函数,则使用默认的无参数构造函数,因此代码确实可以正常运行。

【讨论】:

    【解决方案3】:

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

    所以在你的学生类的情况下,没有自动插入参数构造函数,因为你没有提供任何其他构造函数。

    【讨论】:

      【解决方案4】:

      如果您不提供无参数构造函数,则编译器会为您提供一个,只要没有定义其他构造函数。因此,在您的示例中,如果您注释掉 student() 构造函数,编译器将插入无参数 student() 构造函数。

      【讨论】:

        猜你喜欢
        • 2014-04-14
        • 2011-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多