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

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

邹博裕
2023-03-14

我遵循了www.patrickvideos.com的java SE教程,在关于“类”的章节中遇到了一个问题

Employee alex;
Employee linda;
Employee john;

他明确地说,“亚历克斯、琳达和约翰就是你所说的对象”。然而,如果我没有弄错的话,变量本身不能是对象,而只能包含对对象或类实例的引用。那么,alex、linda、john是对象还是可以安全地假设它们是对象的引用,而此人正在传播错误信息?


共有3个答案

殷耀
2023-03-14
  • 员工是一个类
  • alex是类雇员
  • 的对象
  • alex是类雇员
  • 的实例 jvm的alex是不包含对象数据的对象变量。
  • alex被认为是雇员的一个实例和一个雇员对象。

在Java中,任何变量都不能保存对象。变量只能保存对对象的引用[1]。

变量不是保存对象本身,而是保存在内存中查找对象所需的信息。该信息称为指向对象[1]的引用或指针。

对象未存储在变量中。物体在别处;变量指向它[1]。

[1] https://math.hws.edu/javanotes/c5/s1.html

王君墨
2023-03-14

你是对的,严格来说,在上面的例子中,我们声明了变量alex,linda,john,这些变量将保留对一个对象的引用。

但由于它们引用的是一个对象,在各种术语中,我们可以称它们为对象。

因此,变量可以被认为是句法结构,而对象(它指的是什么)是它的语义。

就像在数学中,你可以说sin(x)是一个函数,但严格来说它是一个表达式。要成为一个函数,还必须指定它的域,所以sin(x)在本例中指的是函数x-

齐浩淼
2023-03-14
匿名用户

你是对的,alexlindajohn都是参考变量。

这三个都是小容器,它们要么不包含任何内容(null),要么包含指向内存中其他位置的对象设置的引用(指针)。这三个变量并不包含一个对象,但它们知道如何让你找到一个对象。

考虑到Java的语法,我们往往会忘记这一区别。在我们的日常编程工作中,我们通常把alex看作对象。我们通常认为:

alex持有一个Person对象,表示被称为Alex的人

...而技术事实是:

alex可能持有一个引用,可以引导我们找到存放我们想要访问的Person对象的其他内存块

在教程中,经常引用alexlinda作为引用变量可能会让人感到疲惫和分心。所以也许我们应该给你教程的作者一些诗意的许可来称呼它们为对象。

一些示例代码,使用Java16中的记录功能。

record Person( String firstName , String lastName , Color favoriteColor ) { }

Person alex = new Person( "Alex" , "Peterson" , Color.MAGENTA );
Person linda = new Person( "Linda" , "Greystone" , Color.GREEN );
Person john = new Person( "John" , "Petrov" , Color.YELLOW );

每次调用new Person都会实例化一个对象,也就是说,在RAM中的某个地方分配一块内存来保存我们的三个成员字段(状态)以及我们认为名为方法(行为)的执行代码的句柄。(对于记录,编译器隐式创建构造函数,getters,等于

new Person的调用返回一个引用,本质上是新Person对象/实例所在的内存中的地址。我们将该引用存储在引用变量alexlinda中。我们将这些变量声明为包含类型为Person的对象的引用。

 类似资料:
  • 变量、对象和引用之间到底有什么区别? 例如:它们都指向某种类型,并且它们都必须保存值(当然,除非您有临时的可null类型),但是它们的功能和实现之间有何不同? 例子: 它们有相同的概念,但又有什么不同呢?

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

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

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

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 我一直在阅读《 清洁代码:敏捷软件技巧手册》 ,在第六章第95-98页中阐明了对象和数据结构之间的区别: 对象将其数据隐藏在抽象之后,并公开对该数据进行操作的函数。数据结构公开其数据,并且没有有意义的功能。 对象公开行为并隐藏数据。这使得在不更改现有行为的情况下添加新的对象变得容易。这也使得很难向现有对象添加新行为。 数据结构公开数据并且没有重大行为。这使向现有数据结构添加新行为变得容