[英]How can I tell the difference between some identifier and a variable declaration?
[英]How do I tell the difference between a variable and a reference in Java?
我来自 C 和 C++,在那里我对指针和引用非常熟悉。 现在我正在 Java 学习数据结构和算法,我看到一张幻灯片谈论链表中的节点被构造成这样
class Node<E>{
E element;
Node<E> next;
public Node(E o){
element = o;
}
}
鉴于我的背景,对我来说这看起来像下一个节点直接包含在这个节点中,并且没有什么可以澄清它是对 memory 中单独地址的引用(指针?)。我也知道在这一点上 Java 不完全有传递引用,这使得这更奇怪(从我的角度来看)。 所以我想知道,如何区分保存实际值或对象的变量与保存对其他值/对象的引用的变量
在 Java 中,与 C 或 C++ 不同,所有类型不是原始类型的变量都是引用。 在这种情况下, next
是一个引用,因为Node
是一个 object,而不是一个原语。 element
也将是对另一个 object 的引用,除非E
是原始元素。 Java 的垃圾收集器为这些引用处理了所有的 memory 管理,所以你不用担心为底层对象分配和释放 memory。 例如:
Foo bar = new Foo(); // bar is an object of the class Foo
Foo foobar = bar; // all objects are references, so bar and foobar are
// referencing the same underlying memory
int a = 1; // a is an int
int b = a; // the value of a is copied into b, because a is a
// primitive
在Java中,变量分为两类。
int, short, boolean, char, long, byte, double, float
), 类型参数E
在此上下文中不能是原始类型,因此在您的代码中, element
和next
都存储对某物的引用。 这就是为什么你的 class 成功实现链表的原因。
至于这如何与“按值传递”一起使用的问题——传递给方法的参数值要么是原语,要么是引用,就像任何其他 Java 变量的值一样。 因此,如果您的参数是引用类型,而不是原始类型; 那么虽然你在做“按值传递”,但它的行为有点像“按引用传递”,因为现在调用的方法可以访问原始 object,而不是副本。 当然,这并不是真正的“按引用传递”,因为被调用的方法不能改变原始变量所指的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.