当前位置: 首页 > 知识库问答 >
问题:

变量、对象和引用之间有什么区别?[重复]

连正信
2023-03-14

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

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

例子:

Dog myDog = new Dog(); //variable myDog that holds a reference to object Dog
int x = 12; //variable x that hold a value of 12

它们有相同的概念,但又有什么不同呢?

共有3个答案

夔桐
2023-03-14

你可以把它想象成回答问题。

一个物体是什么<它就像世界上的任何物理事物一样,是一种自身可识别的“事物”,具有区别于其他“事物”的重要属性。就像你知道的狗之所以是狗,是因为它会吠叫,如果你扔球的话,它会移动尾巴去追球变量是<就像你看着自己的手。每一只手本身就是一只手。他们有手指、指甲和皮肤内的骨头,但你知道一个是你的左手,另一个是右手。也就是说,你可以拥有两个相同类型/种类的“东西”,但每一个都可能以自己的方式不同,可能有不同的价值。

参考文献是一个<如果你看一条街上的两栋房子,虽然它们有自己的正面,但你可以通过它们唯一的地址到达每一栋,也就是说,如果你离得很远,比如三个街区远,或者在另一个国家,你可以说出房子的地址,因为它们仍然在你离开的地方,即使你不能直接指出它们。

为了编程起见,现在用C语言编写示例

class Person{...}
Person Ana = new Person(); //An object is an instance of a class(normally)

也就是说,安娜是一个人,但她有独特的属性,使她区别于其他人。

&Ana //This is a reference to Ana, that is to say, a "where" does the variable 
     //"Ana" is stored, wether or not you know it's value(s)

Ana本身是存储名为“Ana”的人的属性的变量

逄嘉熙
2023-03-14

在解释这些概念时,我经常使用以下类比。

想象一个物体是一个气球。变量是一个人。每个人要么在价值型团队,要么在参考型团队。他们都按照以下规则玩了一个小游戏:

值类型的规则:

  • 你抱着一个充满空气的气球。(值类型变量存储对象。)
  • 你必须一直拿着一个气球。(值类型不可为空。)
  • 当其他人想要你的气球时,他们可以把自己的气球吹起来,然后把它抱在怀里。(在值类型中,复制对象。)
  • 两个人不能拿同一个气球。(值类型不共享。)
  • 如果你想拿一个不同的气球,你必须把你已经拿着的气球打开,然后抓住另一个。(值类型对象被替换时将被销毁。)

引用类型的规则:

  • 你可以拿着一根绳子,这根绳子通向一个充满氦气的气球。(引用类型变量存储对对象的引用。)
  • 你可以拿一根绳子,或者根本不拿绳子。(引用类型变量可为空。)
  • 当别人想要你的气球时,他们可以自己拿一根绳子,把它和你的气球绑在一起。(在引用类型中,将复制引用。)
  • 多个人可以拿着一根绳子,所有绳子都通向同一个气球。(可以共享引用类型对象。)
  • 只要至少有一个人仍将绳子系在特定的气球上,气球就安全了。(只要引用类型对象是可访问的,它就处于活动状态。)
  • 对于任何一个特定的气球,如果每个人最终都放开它,那么气球就会飞走,没有人能再够到它。(引用类型对象可能在某个时候无法访问。)
  • 在比赛结束前的某个时间点,一个丢失的气球可能会由于大气压力自行爆炸。(无法访问的对象有资格进行垃圾收集,这是不确定的。)
越雨泽
2023-03-14

(为了清楚起见,我在这里给出的解释是特定于Java和C#的。不要假设它适用于其他语言,尽管其中一些可能适用。)

我喜欢打个比方,告诉别人我住在哪里。我可以把我的地址写在一张纸上:

  • 变量就像一张纸。它有价值,但它本身不是价值。你可以划掉所有的内容,然后写些别的东西
  • 我写在纸上的地址就像一个参考资料。这不是我的房子,但这是一种导航到我家的方式
  • 我的房子本身就像一个物体。我可以对同一个对象给出多个引用,但只有一个对象

这有用吗?

值类型和引用类型之间的区别在于写在纸上的内容。例如,这里:

int x = 12;

就像一张纸上直接写着数字12。鉴于:

Dog myDog = new Dog();

不写狗对象本身的内容在一张纸上-它创建一个新的,然后写一个引用狗在那张纸上。

非类比术语:

  • 变量表示内存中的存储位置。它有一个名称,您可以在编译时引用它,在执行时它有一个值,该值将始终与其编译时类型兼容。(例如,如果您有一个按钮变量,那么该值将始终是对按钮类型的对象或某个子类的引用,或者是对引用的引用。)
  • 对象是一种独立的实体。重要的是,变量或任何表达式的值永远不是对象,而是引用。一个对象实际上包括:
    • 字段(州)
    • 类型引用(在对象的生命周期内永远不会更改)
    • 监视器(用于同步)

 类似资料:
  • 我遵循了www.patrickvideos.com的java SE教程,在关于“类”的章节中遇到了一个问题 他明确地说,。然而,如果我没有弄错的话,变量本身不能是对象,而只能包含对对象或类实例的引用。那么,

  • 问题内容: 我的Java书解释说,要使用对象,我们可以将它们分配给引用变量。这与指向对象的指针有何不同?Java有指针吗? 谢谢 :) 问题答案: 引用有点像指针,您不能对其进行算术……尽管它更不透明。尽管基础位 可能 是虚拟内存中的地址,但不一定必须如此。它们只是获取对象(或表示null值)的一种方式。因此,尽管它们并不完全相同,但如果您习惯于将指针视为“一种识别对象或导航至该对象的方式”(在某

  • 问题内容: 我是JSON和JavaScript对象的新手。 有人可以解释JSON和JavaScript对象之间的区别吗? 它们有什么用? 这个比那个好吗?还是取决于情况? 什么时候使用哪个,在什么情况下? 为什么首先创建JSON?它的主要目的是什么? 有人可以举例说明何时应该使用JSON而不是JavaScript对象,反之亦然吗? 问题答案: 首先,您应该知道什么是JSON: 它是与 语言无关的

  • 问题内容: 斯威夫特有: 强引用 参考文献薄弱 无人参考 无主引用与弱引用有何不同? 什么时候可以使用无主引用安全? 无主引用是否像C / C ++中的悬空指针一样具有安全风险? 问题答案: 双方并引用不创建一个被引用的对象上保持(又名它们不会取消分配引用的对象增加,为了保留计数,以防止电弧)。 但是为什么要两个关键词呢?这种区别与类型内置在Swift语言中这一事实有关。长话短说:可选类型提供了内

  • 问题内容: 后者是否仅引用由自定义构造函数创建的非原始函数对象(例如,var bird1 = new Bird();)? 问题答案: 这两个术语在ECMAScript规范中定义: 本机对象 ECMAScript实现中的对象,其语义由此规范而不是由主机环境完全定义。 注:本规范中定义了标准本机对象。一些本地对象是内置的。其他的可以在执行ECMAScript程序的过程中构造。 宿主对象 主机环境提供的

  • 问题内容: 我对重排和重绘之间的区别还不清楚(如果有任何区别) 似乎重排可能正在转移各种DOM元素的位置,其中重画只是呈现一个新对象。例如,在移除元素时将发生回流,而在更改其颜色时将发生重新绘制。 这是真的? 问题答案: 至于定义,从那篇文章: 一个 重绘 更改时的元素皮肤改变明显制成,但不影响其布局发生。 这方面的例子包括 ,,,或。根据Opera的说法,重绘是昂贵的,因为浏览器必须验证DOM树