为什么我需要两个不同的类来创建Java中的IntList对象?
我正在学习Adam Webber的“现代编程语言”,我刚刚开始学习Java。书中有一个关于如何创建新类的示例。在这个例子中,我们试图定义一个新类,一个整数列表。为此,我们首先定义以下类:为什么我需要两个不同的类来创建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
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()例如,code>将导致一个NullPointerException