变量、对象和引用之间究竟有什么区别?
例如:它们都指向某种类型,并且它们都必须保存值(当然,除非您有临时可为空的类型),但它们的功能和实现究竟有何不同?
例子:
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
引用...然后我们在 that 引用所指的对象上调用getLength()
。
关于java - 变量、对象和引用之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010172/