Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我需要两个不同的类来创建Java中的IntList对象?_Java_Class_Object - Fatal编程技术网

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

为什么我需要两个不同的类来创建Java中的IntList对象?,java,class,object,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

我正在学习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));
 }
}

提前多谢

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

由于您正在学习现代编程,请查看

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


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

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

A通常由节点组成,如图中所示:

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

  • 包含数据和指向列表中下一个节点的指针的节点
  • 包含其中所有节点的整个列表
  • 这两个类(节点和整个列表)由您正在阅读的书的作者在类中描述:

  • ConsCell
    作为节点,带有指向上一个节点(头)的附加指针
  • IntList
    ,它包含起始节点(
    ConsCell start
    ),并帮助您处理从此节点开始的所有节点。这使得列表的客户机可以轻松地与整个列表交互,而不是直接在节点上操作并干扰它们

  • 我想你不明白的问题是,那本书的作者正在实现一个

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

    你为什么不试试更简单的方法呢? 这是一个非常有趣的学习环境。你可以找到一个,和。还有一些(不幸的是,有些不起作用)

    关于那本书。。。适合初学者吗?Java规范书在世界范围内得到了广泛认可。你甚至可以免费下载第三版


    希望这有帮助。

    这取决于用于实现列表的设计。使用链表时,通常会创建一个类来表示条目。如果对列表中的任意元素调用
    length
    ,则会收到该元素之后的元素数,而不是列表的完整大小。另外,您需要跟踪
    start
    单元格。您知道这只是一个面向对象编程的示例,对吗?你不会在现实生活中编写这种特殊的代码。你可以这样做,但你必须使用
    getTail()
    而不是
    getHead()
    。。。但是答案解释了为什么应该使用包装器类。@Powerlord为什么?它当然可以改进(泛型、命名…),但它是链表的标准实现。是的,这也是书中所说的。但是为什么ConsCell类不支持空列表呢?为什么我不能通过以下操作创建一个空列表:ConsCell empty=new ConsCell(null,null);这不是一个空列表,因为您仍然有一个节点。顺便说一句,它不会编译,因为
    int
    不能
    null
    。空列表是一个
    null
    节点,因此您无法对其进行操作:
    ConsCell empty=null;empty.length()将导致一个
    NullPointerException