变量、对象和引用之间到底有什么区别?
例如:它们都指向某种类型,并且它们都必须保存值(当然除非您有临时可为空的类型),但它们的功能和实现到底有何不同?
示例:
Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12
它们具有相同的概念,但它们有何不同?
最佳答案
(需要明确的是,我在这里给出的解释是针对 Java 和 C# 的。不要假设它适用于其他语言,尽管其中的一部分可能如此。)
我喜欢用告诉某人我住在哪里的类比。我可能会把我的地址写在一张纸上:
- 变量就像一张纸。它具有值(value),但它本身并不是值(value)。您可以划掉其中的任何内容并写一些其他内容。
- 我写在纸上的地址就像一个引用。这不是我的房子,但它是导航到我的房子的一种方式。
- 我的房子本身就像一个物体。我可以给出对同一对象的多个引用,但只有一个对象。
这有帮助吗?
值类型和引用类型之间的区别在于纸上写的内容。例如,这里:
int x = 12;
就像一张纸,上面直接写着数字12。鉴于:
Dog myDog = new Dog();
不会将 Dog 对象内容本身写入纸上 - 它会创建一个新的 Dog
,然后在那张纸上写入对该狗的引用。
用非类比术语来说:
- 变量代表内存中的存储位置。它有一个名称,您可以在编译时引用它,并且在执行时它有一个值,该值始终与其编译时类型兼容。 (例如,如果您有一个
Button
变量,则该值将始终是对Button
类型的对象或某个子类的引用,或者是null
引用。) - 对象是一种独立的实体。重要的是,变量或任何表达式的值都不是对象,而只是引用。一个对象实际上包括:
- 字段(州)
- 类型引用(在对象的生命周期内永远不会改变)
- 监视器(用于同步)
- 引用是用于访问对象的值 - 例如调用其方法、访问字段等。您通常使用
.
运算符导航引用。例如,如果foo
是Person
变量,则foo.getAddress().getLength()
将采用foo
(引用)的值,并对该引用引用的对象调用getAddress()
。结果可能是一个String
引用...然后我们对该引用引用的对象调用getLength()
。
关于java - 变量、对象和引用之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33379515/