在Java中,对象变量是否包含对象的地址?

Bha*_*axy 4 java

我正在和我的老师谈话,她提到一个对象变量(她的意思是一个对象的实例)不包含对象本身,而是包含内存中的地址.

我听说在Java中,对象的实例实际上包含对内存中对象的引用.我错了吗?引用与包含内存中的地址或其他内容相同吗?

Jon*_*eet 12

一个对象的变量是不一样的对象的实例.这是真的,你的变量,它们的值,并区分对象重要.

例如:

String x = "hello";
Run Code Online (Sandbox Code Playgroud)

变量x.它就像一张纸,上面写着一个.

变量的是一个引用 - VM可用于获取字符串对象本身的一些数据.它不一定是一个地址 - 它只是"获取对象数据的一种方式".(有关这方面的更多信息,请阅读Eric Lippert的博客文章"引用不是地址" - 这是关于C#而不是Java,但它的原理是相同的.)

所述对象本身是一个独立的实体.

要使用一个真实世界的例子,想象一下,我有一张纸,上面写着我的家庭住址.这里显然有三件事:

  • 那张纸(就像一个变量).这张纸本身不是我的家庭住址,也不是房子.它只是可以存储价值的东西.
  • 我的家庭住址不是一张纸,也不是房子.这只是一个数值,它可以让一个人得到我的房子.
  • 我的房子既不是一张纸,也不是一个地址.这是一个对象.

当您考虑参数传递和变量赋值之类的事情时,这变得很重要.例如:

House x = new House("Jon");
House y = x;
Run Code Online (Sandbox Code Playgroud)

在这里,我们有两个变量,x并且y,像两张纸.我们建造一所房子,并写下它的指示x.然后,我们复制形式,它的价值xy.请注意,它们仍然是完全独立的纸张 - 但它们目前具有相同的值.只有一个物体 - 我们只建造了一个房子 - 但现在两张纸上有相同的方向.

如果一个人按照纸上的指示x并将前门涂成红色,那么第二个人按照纸上的指示y,就会找到一个带红色前门的房子.

另一方面,如果一个人在纸上潦草地写下指示x,那根本不会影响写在纸上的指示y.


Boz*_*zho 5

好吧,不是一个内存地址,而是JVM中可以翻译的内容,是的.

事情Foo foo = new Foo()只是一个参考Foo,而不是整个结构Foo.