【问题标题】:Whats the distinction between objects and variables? [duplicate]对象和变量有什​​么区别? [复制]
【发布时间】:2021-10-05 23:13:28
【问题描述】:

我遵循www.patrickvideos.com 的java SE 教程,在“类和对象”一章中遇到了一个问题。制作教程的人给出了以下代码示例:

Employee alex;
Employee linda;
Employee john;

他明确表示"alex, linda, john are what you call objects"。但是,如果我没记错的话,变量本身不能是对象,而只是保存对对象或类实例的引用。 alex, linda, john 对象也是如此,还是可以安全地假设它们是对对象的引用并且那个人正在传播错误信息?

【问题讨论】:

  • 你有正确的直觉。本教程只是过度简化了问题。坚持你所知道的;你说的没有错
  • 但也请注意,这是一种简化,出于实际目的,每个人都会进行,因为出于实际目的,这些变量在使用时“是”对象。在技​​术层面上,你是对的,在实践层面上,这是不必要的迂腐,所以把这些知识放在你的口袋里,但你都是对的:它们是变量(在解析器层面),它们'是对象(在“你的代码将它们视为什么”级别)。
  • 另一方面,Java 新手程序员对这些(过度)简化感到困惑……正如我们在 StackOverflow 上遇到的其他问题所充分说明的那样。从这些人的角度来看,这种培训材料的迂腐是必要的
  • @Stephen C 从技术上讲,区分引用变量和将变量引用为对象的误解的能力并不是学究气的,应该很好理解。
  • @Ineversurrender93 - 这正是我的观点!这就是为什么培训材料(学究式地)正确如此重要的原因。以及为什么 OP 正确地指出这一点。希望有人能引起 PatrickVideos 的关注!

标签: java


【解决方案1】:

是的,引用变量

你说的没错,alexlindajohn都是reference variables

这三个都是小容器,它们要么不保存任何东西 (null) 要么将 reference (pointer) 保存到内存中其他地方的对象设置。这三个变量不持有一个对象,但他们知道如何让你一个对象。

鉴于 Java 中的语法,我们往往会忘记这种区别。在我们日常的编程工作中,我们通常会将alex 视为对象。我们一般认为:

alex 拥有一个 Person 对象,代表被称为 Alex 的人类

……而技术上的真相是:

alex 可能包含一个引用,该引用可以将我们引导到其他地方的内存块,其中包含我们想要访问的 Person 对象

在教程中,不断将alexlinda 用作参考变量可能会让人厌烦和分心。所以也许我们应该给你教程的作者一些诗意的许可,称它们为对象。

示例代码

一些示例代码,使用 Java 16+ 中的 records 功能。

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 中的某处分配一块内存来保存我们的三个成员字段(状态)以及我们认为是命名方法(行为)的可执行代码的句柄。 (作为记录,编译器隐式创建构造函数、getter、equals & hashCodetoString 方法。另外,您可以添加更多。)

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

【讨论】:

  • 是的......但程序员不是诗人......正如我们告诉那些浪费太多时间“美化”他们的代码的人一样 :-)
  • 不幸的是,许多 Java 新手程序员开始对变量和对象之间的区别感到非常困惑,因为“富有诗意的”教程用 OP 发现的语句模糊了界限。为新手程序员编写/展示培训材料的人应该清晰准确。他的诗歌执照应该被吊销:-)
  • 插图不错!
【解决方案2】:

你说得对,严格来说,在上面的例子中,我们声明了变量 alex, linda, john 将持有一个对象的引用。

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

所以变量可以被认为是一个句法结构,而对象(它所指的)是它的语义。

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

【讨论】:

    【解决方案3】:
    • Employee 是一个类
    • alexEmployee 类的对象
    • alex 是类 Employee 的一个实例
    • jvm的alex是不包含对象数据的对象变量。
    • 为简单起见,alex 被称为 EmployeeEmployee 对象的一个​​实例。

    在 Java 中,没有任何变量可以保存对象。 变量只能保存对对象 [1] 的引用。

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

    对象未存储在变量中。对象在其他地方;变量指向它 [1]。

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

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 2016-06-13
      • 2012-01-19
      • 2011-04-27
      • 2019-02-09
      相关资源
      最近更新 更多