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 引用...然后我们对该引用引用的对象调用 getLength()

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

相关文章:

java - 如果某些参数相等,如何对对象参数进行排序

java - Opencv 使用套接字将 mat 从 java 发送到 python

java - Java中UDP数据报仅显示第一个字符

c# - 如何在集成测试项目中替换中间件

c# - 选择 ListBox 项返回 null

c++ - C++类中的两种不同的变量初始化。有什么不同?

Javascript 脚本返回错误

java.lang.LinkageError : ClassCastException 错误

c# - 自定义授权(权限)ASP.NET MVC

c++ - 函数头中的 C/C++ 数组变量