如果我有一个ListNode class,它是
public class ListNode{
int data;
ListNode nextNode;
}
和一个List类,它是
public class List{
private ListNode firstNode;
private ListNode lastNode;
private String name;
public List(String listName){
name = listName;
firstNode = lastNode = null;
}
}
最后一个语句"firstNode = lastNode = null"是什么意思?是否firstNode。data = null或firstNode。nextNode = null?
编辑:看来我回答错问题了。正如下面评论中提到的OP:
对不起,我的问题可能不够清楚,我真正困惑的是,当执行"firstNode = null"时,是否firstNode。data = null或firstNode。nextNode = null,因为firstNode是ListNode类型的对象,它有int数据和ListNode类型的实例。
赋值firstNode = null
后,不存在.data
和.nextNode
。您必须首先将firstNode
分配给new ListNode()
。
一旦你这样做,它的data
成员将被初始化为0
, nextNode
成员将被初始化为null
,因为如果没有显式初始化,这些是成员字段的默认初始值。但是,同样,您需要实例化ListNode
并首先将其分配给firstNode
,否则如果您尝试在null
时访问它,您将获得NullPointerException
。
原始答案,re: firstNode = lastNode = null
将firstNode
和lastNode
同时赋值给null
。
这是一种常用的语法技巧,它利用了这样一个事实,即赋值表达式作为一个整体计算为赋值后的变量的值:
a = b = 1
=> a = (b = 1) (b = 1) assigns b then evaluates to 1
=> a = 1
只要类型是兼容的,你可以将任意多个链接在一起:
a = b = c = d = 1
=> a = b = c = (d = 1) (d = 1) assigns d then evaluates to 1
=> a = b = (c = 1) (c = 1) assigns c then evaluates to 1
=> a = (b = 1) (b = 1) assigns b then evaluates to 1
=> a = 1
不兼容的类型将导致错误:
Integer x;
Double y;
x = y = null; // error: cannot convert from Double to Integer
这和你做以下事情时使用的技巧是一样的:
int ch;
while ((ch = input.read()) != -1) {
...
}
From JLS 15.26:
在运行时,赋值表达式的结果是赋值发生后变量的值。
这是空LinkedList
的"起始逻辑"当您实例化类型为List
的对象时,它最初是空的,因此没有firstNode
也没有lastNode
,因此它们都是null