一尘不染

Java什么是类,引用和对象?

java

我从事Java编程已有2年了,显然我遇到了一个问题,无法再次理解和区分类,引用和对象(我不明白为什么我忘记了这些概念)。

让我们来解决这个问题,尽管我已经知道对象是什么,但是我不确定类或引用是否相同。

有人可以很好地理解并且完整地区分什么是类,引用和对象吗?

我所知道的是,该类更像是对象的模板(房屋的蓝图,其中类是蓝图,而房屋是一个对象)。


阅读 819

收藏
2020-03-09

共1个答案

一尘不染

如果你喜欢隐喻:

  • 一堂课就像一所房子的蓝图。使用此蓝图,你可以建造任意数量的房屋。
  • 你建造的每个房屋(或用OO语言实例化)都是一个对象,也称为实例。
  • 每个房子当然都有一个地址。如果你想告诉某人房子在哪里,请给他们一张卡片,上面写上地址。该卡是对象的参考。
  • 如果要参观房屋,请查看卡上写的地址。这称为解引用。
    你可以随意复制该参考,但是只有一所房子-你只是在复制上面有地址的卡,而不是房子本身。

在Java中,你不能直接访问对象,只能使用引用。Java不会相互复制或分配对象。但是你可以复制引用并将其分配给变量,以便它们引用同一对象。Java方法始终是按值传递的,但是该值可以是对象的引用。所以,如果我有:

Foo myFoo = new Foo();     // 1
callBar(myFoo);            // 2
myFoo.doSomething()        // 4

void callBar(Foo foo) {
    foo = new Foo();       // 3
}

然后,让我们看看发生了什么。

  1. 第1行中发生了几件事。它new Foo()告诉JVM使用该Foo蓝图建造一座新房子。JVM会这样做,并返回对房子的引用。然后,你将此引用复制到myFoo。这基本上就像要求承包商为你盖房子。他会的,然后告诉你房子的地址。你写下这个地址。
  2. 在第2行中,将此地址提供给另一个方法callBar。接下来让我们跳到该方法。
  3. 在这里,我们有一个参考Foo foo。Java是通过按值,所以foo在callBar是一个拷贝的的myFoo参考。可以想像是给callBar自己的卡,上面带有房子的地址。什么是callBar与此卡怎么办?它要求建造一所新房子,然后使用你提供的卡来写该新房子的地址。请注意,callBar现在无法到达第一个房屋(我们在第1行中建造的房屋),但是由于以前有其地址的卡现在具有其他房屋的地址,因此该房屋没有改变。
  4. 回到第一个方法,我们取消引用myFoo以在其上调用方法(doSomething())。这就像看卡片,去住地址在卡片上的房子,然后在那个房子里做些事情。请注意,我们的带有myFoo的地址的卡在callBar方法上是不变的-请记住,我们提供callBar了一份参考副本。

整个序列如下所示:

  1. 要求JVM盖房子。确实,并给了我们地址。我们将此地址复制到名为的卡上myFoo。
  2. 我们调用callBar。在此之前,我们将写入的地址复制myfoo到新卡上,然后提供给callBar。它叫那张卡foo。
  3. callBar向JVM询问另一所房子。它创建它,并返回新房子的地址。callBar将此地址复制到我们给它的卡上。
  4. 回到第一种方法,我们看看原始的,未更改的卡;到地址在我们卡上的房子去;在那里做点什么。
2020-03-09