如果超类没有默认构造函数,为什么这个Java代码中的子类有默认构造函数?

如果超类没有默认构造函数,为什么这个Java代码中的子类有默认构造函数?,java,constructor,Java,Constructor,我四处寻找这个问题的答案,但到目前为止我还不明白这一点。我有3个Java类,BinaryTree和HuffmanTree(扩展了BinaryTree)以及HuffmanData(用于HuffmanTree,与这个问题无关) HuffmanTree在其构造函数中显式调用super()。我无法理解的是,为什么它包含对默认构造函数的调用?超类BinaryTree根本没有默认构造函数,因此根据我的理解,代码应该抛出异常,但它没有 以下是BinaryTree的代码: public class Binary

我四处寻找这个问题的答案,但到目前为止我还不明白这一点。我有3个Java类,BinaryTree和HuffmanTree(扩展了BinaryTree)以及HuffmanData(用于HuffmanTree,与这个问题无关)

HuffmanTree在其构造函数中显式调用super()。我无法理解的是,为什么它包含对默认构造函数的调用?超类BinaryTree根本没有默认构造函数,因此根据我的理解,代码应该抛出异常,但它没有

以下是BinaryTree的代码:

public class BinaryTree {
    private Comparable data;
    private BinaryTree left;
    private BinaryTree right;
    public final static BinaryTree NIL = new BinaryTree(null, null, null);

    // Constructor 1
    public BinaryTree (Comparable data, BinaryTree left, BinaryTree right) {
        this.data = data;
        this.left = left;
        this.right = right;
    }

    // Constructor 2
    public BinaryTree (Comparable data) {
        this(data, BinaryTree.NIL, BinaryTree.NIL);
    }
    .
    .
    . // other methods
}
这是HuffmanTree的代码:

public final class HuffmanTree extends BinaryTree implements Comparable {
    private String[] table;
    private static final int NUM_CHARS = 256;
    private static final HuffmanTree NIL = new HuffmanTree();
              // Calls default constructor in this class, but how does it work?

    // Constructor 1 --- what does this do??
    private HuffmanTree() {}

    // Constructor 2
    private HuffmanTree (char c, int f) {
        super(new HuffmanData(c,f), NIL, NIL);
    }

    // Constructor 3 
    private HuffmanTree (HuffmanTree left, HuffmanTree right) {
        super(new HuffmanData( (char)0, left.frequency()+right.frequency()),
                                                 left, right);
    }
    .
    .
    . // other methods
}

如果问题不清楚,道歉。请让我知道如何更好地解释它。

私有无参数构造函数除了导致编译错误外,没有任何有用的功能。看起来有人试图通过使其私有化使其不可用,但另一个构造函数的存在已经阻止编译器生成默认构造函数


我不知道你为什么认为会抛出异常,除非你混淆了异常和编译错误。编译错误不是例外,它们是打印出来的,而不是抛出的。

私有无参数构造函数除了导致编译错误外,没有任何有用的功能。看起来有人试图通过使其私有化使其不可用,但另一个构造函数的存在已经阻止编译器生成默认构造函数


我不知道你为什么认为会抛出异常,除非你混淆了异常和编译错误。编译错误不是例外,它们是打印的,而不是抛出的。

在Java中,默认构造函数是由JVM自动创建的,无论您是否编写它。因此,在BinaryTree类的代码中,默认构造函数是自动创建的,当HuffmanTree的对象调用默认构造函数时,它调用BinaryTree的默认构造函数。

在Java中,默认构造函数是由JVM自动创建的,无论您是否编写它。因此,在BinaryTree类的代码中,会自动创建默认构造函数,当HuffmanTree的对象调用默认构造函数时,它会调用BinaryTree的默认构造函数。

这将导致编译器错误
找不到适合BinaryTree()的构造函数。

只有在不为类提供任何构造函数的情况下,才会为类创建默认的无参数构造函数。如果为类提供构造函数,则必须自己创建一个无参数构造函数

声明

如果隐式声明了默认构造函数,但超类没有可访问的构造函数(§6.6),且该构造函数不带参数且没有throws子句,则这是编译时错误


我的朋友这样做会产生一个编译器错误
没有为BinaryTree()找到合适的构造函数

只有在不为类提供任何构造函数的情况下,才会为类创建默认的无参数构造函数。如果为类提供构造函数,则必须自己创建一个无参数构造函数

声明

如果隐式声明了默认构造函数,但超类没有可访问的构造函数(§6.6),且该构造函数不带参数且没有throws子句,则这是编译时错误


只有在不提供任何其他构造函数的情况下,第一句才是正确的。只有在不提供任何其他构造函数的情况下,第一句才是正确的。这并不解释为什么不会引发异常。super()调用没有任何用处是什么意思。。?编译器会为您插入一个无参数的超级调用,如果您的超级类没有任何无参数构造函数,则会导致编译时错误。这并不解释为什么不会引发异常。超级()调用没有任何用处是什么意思。。?编译器会为您插入一个无参数超调用,如果您的超类没有任何无参数构造函数,则会导致编译时错误。这是否意味着只要您提供默认构造函数,对象上的无参数构造函数就会被隐藏。(自从我开始使用Java已经有几年了——一定是生锈了!)当你为你的类创建一个构造函数时,编译器不会插入任何默认的无参数构造函数。但是编译器所做的是通过在构造函数中插入
super()
来调用超级类构造函数,前提是您不扩展没有无参数构造函数的任何其他类。尽管我同意您的回答,但您的JLS引用不适用于这种情况。
HuffmanTree
的默认构造函数不是隐式声明的,而是显式声明的。我同意这不适用于本例,但我包含此内容是为了了解它的工作原理。感谢您的解释!然而,当我的教授在课堂上执行此操作时,没有出现错误或异常。也许我犯了一个错误,但您的解释对我来说是有意义的。这是否意味着只要您提供一个默认的构造函数,对象上的no-args构造函数就会被隐藏。(自从我开始使用Java已经有几年了——一定是生锈了!)当你为你的类创建一个构造函数时,编译器不会插入任何默认的无参数构造函数。但是编译器所做的是通过在构造函数中插入
super()
来调用超级类构造函数,前提是您不扩展没有无参数构造函数的任何其他类。尽管我同意您的回答,但您的JLS引用不适用于这种情况。
HuffmanTree
的默认构造函数不是隐式声明的,而是显式声明的。我同意这不适用于本例,但我包含此内容是为了了解它的工作原理。感谢您的解释!然而,当我的教授在课堂上执行此操作时,没有出现错误或异常。也许我弄错了,但你的解释是有道理的