我已经编写 Java 2 年了,遇到了一个无法理解和区分类、引用和对象的问题。
我不确定类或引用是否相同,尽管我知道对象是什么。
有人可以完整地区分什么是类、引用和对象吗?
我所知道的是,类更像是对象的模板(房屋的蓝图,其中类是蓝图,房屋是对象)。
原文由 user962206 发布,翻译遵循 CC BY-SA 4.0 许可协议
我已经编写 Java 2 年了,遇到了一个无法理解和区分类、引用和对象的问题。
我不确定类或引用是否相同,尽管我知道对象是什么。
有人可以完整地区分什么是类、引用和对象吗?
我所知道的是,类更像是对象的模板(房屋的蓝图,其中类是蓝图,房屋是对象)。
原文由 user962206 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
如果您喜欢住房隐喻:
您可以随心所欲地复制该参考资料,但只有一栋房子——您只是复制上面有地址的卡片,而不是房子本身。
在Java中,不能直接访问对象,只能使用引用。 Java 不会相互复制或分配对象。但是您可以复制和分配对变量的引用,以便它们引用同一个对象。 Java 方法总是按值传递,但值可以是对象的引用。所以,如果我有:
那么让我们看看发生了什么。
new Foo()
告诉 JVM 使用Foo
蓝图建造一座新房子。 JVM 这样做,并返回对房子的引用。然后将此引用复制到myFoo
。这基本上就像要求承包商为您建造房屋一样。他知道了,然后告诉你房子的地址;你把这个地址写下来。callBar
。接下来让我们跳到那个方法。Foo foo
。 Java 是按值传递的,因此foo
中的callBar
是myFoo
参考的 _副本_。把它想象成给callBar
它自己的卡片,上面有房子的地址。callBar
用这张卡做什么?它要求建造一座新房子,然后用你给它的卡片写下新房子的地址。请注意callBar
现在无法到达第一所房子(我们在第 1 行中建造的那所房子),但由于过去有地址的卡现在有上面有其他房子的地址。myFoo
以在其上调用一个方法(doSomething()
)。这就像看卡片,去卡片上有地址的房子,然后在那个房子里做点什么。请注意,我们的卡myFoo
的地址callBar
方法更改——记住,我们给了callBar
我们参考的 _副本_。整个序列类似于:
myFoo
的卡中。callBar
。在我们这样做之前,我们将写在myfoo
上的地址复制到一张新卡中,我们将其提供给callBar
。它调用该卡foo
。callBar
向 JVM 请求另一栋房子。它创建它,并返回新房子的地址。callBar
将这个地址复制到我们给它的卡上。