2

我已经四处寻找这个问题的答案,但到目前为止我还没有理解这一点。我有 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
}

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

4

3 回答 3

2

这我的朋友会产生编译器错误no suitable constructor found for BinaryTree()

仅当您不为该类提供任何构造函数时,才会为该类创建默认的无参数构造函数。如果为类提供构造函数,则必须自己创建一个无参数构造函数。

JLS指出

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

于 2013-10-31T04:56:49.097 回答
-1

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

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

于 2013-10-31T04:46:23.820 回答
-3

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

于 2013-10-31T04:47:06.470 回答