繁体   English   中英

如何区分 Java 中的变量和引用?

[英]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在此上下文中不能是原始类型,因此在您的代码中, elementnext都存储对某物的引用。 这就是为什么你的 class 成功实现链表的原因。

至于这如何与“按值传递”一起使用的问题——传递给方法的参数值要么是原语,要么是引用,就像任何其他 Java 变量的值一样。 因此,如果您的参数是引用类型,而不是原始类型; 那么虽然你在做“按值传递”,但它的行为有点像“按引用传递”,因为现在调用的方法可以访问原始 object,而不是副本。 当然,这并不是真正的“按引用传递”,因为被调用的方法不能改变原始变量所指的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM