为什么我需要两个不同的类来在Java中创建IntList对象?

时间:2015-05-07 21:03:28

标签: java class object

我正在研究Adam Webber的“现代编程语言”,我刚开始使用Java。书中有一个关于如何创建新类的例子。在示例中,我们尝试定义一个新类,一个整数列表。为此,我们首先定义以下类:

public class ConsCell {

private int head;
private ConsCell tail;

public ConsCell (int h, ConsCell t) {
    head = h;
    tail = t;
 }

public int getHead () {
    return head;
 }  

public ConsCell getTail () {
    return tail;
 }
}

然后,由于某些原因我不明白,我们创建了一个额外的类:

public class IntList {

private ConsCell start;

public IntList (ConsCell s) {
    start = s;
 }

public IntList cons (int h) {
    return new IntList(new ConsCell(h, start));
 }

public int length () {
    int len = 0;
    ConsCell foo = start;
    while (foo!=null) {
        len++;
        foo = foo.getTail();
    }
    return len;
 }
}

所以,我的问题是为什么我们需要IntList类?我们不能在ConsCell类中定义方法length和cosn,如下所示:

public class ConsCell {

private int head;
private ConsCell tail;

public ConsCell (int h, ConsCell t) {
    head = h;
    tail = t;
 }

public int getHead () {
    return head;
 }  

public ConsCell getTail () {
    return tail;
 }

public int length () {
    int hd = head;
    if (hd==null) return 0;
    ConsCell tl = tail;
    int len = 1;
    while (tl.getHead()!=null) {
        len++;
        tl = tl.getTail();
    }
    return len;
 }

public ConsCell cons (int newHead) {
    return new ConsCell (newHead, new ConCell(head,tail));
 }
}

提前多多感谢!

4 个答案:

答案 0 :(得分:1)

单元格与由单元格组成的列表不同。在单元格上调用length并希望获得列表的长度是错误的语义。

由于您正在学习现代编程,请查看Wikipedia article about cons

  

cons构造包含两个值或指向值的指针的内存对象。这些对象称为(cons)单元格,conses,非原子s表达式(“NATSes”)或(cons)

“cons”这个词有特定的含义。它不是列表,而是两个值的 。这样的一对可以使用来构建列表。这就是Lisp如此美丽的原因。复杂的东西是从非常简单的部分构建的。

答案 1 :(得分:0)

主要是允许空列表,因为null单元格不是一种非常漂亮的方式来表示它。人们还可以争辩说,单元格将提供低级操作,而列表具有更高级别的接口。可能不需要单元格来实现类似列表的数据结构(例如,考虑ArrayList),这是一个实现细节,而列表本身更具概念性。

答案 2 :(得分:0)

Linked List通常由节点组成,如下图所示:

enter image description here

在面向对象编程中,我们可以看到有两个元素:

  1. 该节点,包含数据和指向列表中下一个节点的指针。
  2. 整个列表,包含其中的所有节点。
  3. 这两个类(节点和整个列表)在您正在阅读的书的作者的课程中描述:

    1. ConsCell作为节点,带有指向前一个节点(head)的附加指针。
    2. IntList包含起始节点(ConsCell start),可帮助您处理从此节点开始的所有节点。这使列表的客户端能够与整个列表进行交互,而不是直接在节点上操作并弄乱它们。

答案 3 :(得分:0)

我认为您不明白的问题是该书的作者正在实施doubly linked list

这是一个非常复杂的开始示例,我的意思是一个相当困难的第一个示例类。

为什么不尝试更简单的方法? BlueJ是一个非常有趣的学习环境。您可以找到tutorial for beginnersanother one。还有一些examples(不幸的是,有些不起作用)。

关于那本书......是否适合初学者? Java的标准书是Thinking in Java,在世界范围内得到了广泛的认可。你甚至可以免费下载第3版。

希望这有帮助。