java - 变量、对象和引用之间有什么区别?

标签 java c# variables object reference

变量对象引用之间究竟有什么区别?

例如:它们都指向某种类型,并且它们都必须保存值(当然,除非您有临时可为空的类型),但它们的功能和实现究竟有何不同?

例子:

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 引用。)
  • 对象是一种独立的实体。重要的是,变量或任何表达式的值绝不是一个对象,只是一个引用。一个对象实际上包括:
    • 字段(状态)
    • 类型引用(在对象的生命周期内永远不会改变)
    • 监视器(用于同步)
  • 引用是用于访问对象的值 - 例如在其上调用方法、访问字段等。您通常使用 . 运算符导航引用。例如,如果 fooPerson 变量,则 foo.getAddress().getLength() 将采用 foo (引用)并在该引用所引用的对象上调用 getAddress()。结果可能是一个 String 引用...然后我们在 that 引用所指的对象上调用 getLength()

关于java - 变量、对象和引用之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32010172/

相关文章:

java - 我如何使用 slick 3.0 一次返回一行?

java - JComboBox 返回空指针异常

java - 将音乐文件从一个应用程序发送到另一个应用程序

c# - 将 ServiceStack ICacheClient 与 Redis 和 Ninject 结合使用

css - Bootstrap 变量在 rails 中不可用

java - 我无法从 Java 的较低级别访问 "higher level"变量

java - 这个 catch block 内部发生了什么?

c# - 我在使用 C# 对象初始值设定项时做错了什么?

c# - 在 SQL Server 中插入时,如何处理数据表中的 NULL 值变成丢失的 XML 元素?

javascript - 如何替换数组中的某个符号?