【问题标题】:Java - Inheritance IssueJava - 继承问题
【发布时间】:2014-04-21 21:09:54
【问题描述】:

我遇到了一个问题,因为我最近一直在尝试使用不同的知名数据结构(例如链表、树、尝试、堆等)编写自己的“库”。

遗憾的是,我在编写第一个(链表)时遇到了困难。为此,我编写了一个“Node”类(单独的文件)和一个“Linked List”类,它“扩展”了“Node”类(以便将其用作参考对象)。 长话短说,这是我目前的代码:

“Node.java”

package helper;

public class Node<T> {
    private T value;
    private Node<T> next;

    protected Node(T newValue) {
        value = newValue;
        next = null;
    }

    protected void printNode() {
        System.out.print("{" + value + "} ");
    }
}

“LinkedList.java”

package source;

import helper.Node;

public class LinkedList<T> extends Node<T> {
    private Node<T> head, current;

    protected LinkedList(T newValue) {
        super(newValue);
        // TODO Auto-generated constructor stub
    }
}

显然,我什至还没有完成一半,但我不明白的是,为什么在 C++ 上(用 C++ 编码大约 4 年,最近才开始使用 java)我不必定义构造函数这会进行“super()”调用,就像调用派生类的构造函数一样,但是在 Java 上,我必须这样做..

我想做的就是使用“Node”类在“LinkedList”类中​​创建“Node”对象。我不希望“LinkedList”构造函数调用“Node”构造函数(我们应该调用构造函数后有一个空的链表)。

对不起,如果我听起来有点混乱,但希望你明白我想说的话。提前致谢。

编辑:请不要告诉我使用 Java 内置库,因为我这样做只是为了练习。

【问题讨论】:

  • 简单:不要让LinkedList 扩展Node。这没有意义:链表不是节点,链表有节点!您无需继承 Node 即可使用它。
  • 我不明白你的设计。为什么LinkedList 与Node 有is-a-关系?
  • 抱歉,现在明白了.. 我不知道为什么我认为能够在 Java 中使用 Node 类,我必须将其称为派生类.. 好吧..在 C++ 中有些不同,但谢谢。

标签: java inheritance constructor extends


【解决方案1】:

在这种情况下,您应该更喜欢组合而不是继承。现在你的 LinkedList isA Node 并且由于 Node 只有一个带值的构造函数,你必须调用 super(value)。

你也可以使用 java.util 包中的LinkedList(不要在这里重新发明轮子)。

【讨论】:

  • 谢谢,但是你看,我不是在重新发明轮子,如果你只是阅读我的完整帖子,你就会看到我说这是为了练习。
【解决方案2】:

您的LinkedList 结构应该包含 Node,而不是 Node。在 Java 中,如果未提供无参数构造函数,则始终必须显式调用超级构造函数。每当您创建一个对象时,所有超类的构造函数都会按从最通用到最具体的顺序调用,因此在这种情况下,Node 构造函数将在LinkedList 构造函数之前首先被调用。

【讨论】:

  • 非常感谢,我不知道我写的时候在想什么:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 2011-08-04
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多