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

java中的对象和引用之间的区别?

呼延渝
2023-03-14
public class TestVO {

    public static void main(String[] args) {
        VO vo1 = new VO();
        VO vo2 = new VO();
        VO vo3;
        VO vo4 = new VO();

        vo1.setName("Sourav");
        vo2.setName("Anil");

        vo3 = vo1;
        vo4 = vo1;

        System.out.println(" " + vo4.getName());

        vo1.setName("Abhishek.");

        System.out.println(vo1.getName() + "  " + vo2.getName() + " " + vo3.getName() + " " + vo4.getName());
    }
}
Sourav

Abhishek.  Anil Abhishek. Abhishek.

我的问题是为什么第二版是Abhishek..我在vo4对象中保留了一个vo1对象的副本,而不是引用。这意味着它创造了一个新的记忆。vo1和vo4是不同的。那么为什么vo4.getname在第二次更改。我正在设置vo1对象,但vo4是自动更改的。为什么会发生??

共有1个答案

王昊
2023-03-14

我在vo4对象中保留了一个vo1对象的副本,而不是引用。

不,您已经将变量vo1vo4指向同一个对象,如下所示:

+-----+
| vo1 |--------\
+-----+         \    +----------------+
                 --->| (object)       |
+-----+         /    | name = Abishek |
| vo4 |--------/     +----------------+
+-----+

让我们按照代码进行操作:

VO vo1 = new VO();
+-----+              +----------------+
| vo1 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+
VO vo2 = new VO();
+-----+              +----------------+
| vo1 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+
VO vo3;

...它只创建带有nullvo3(不指向任何对象)。

然后:

VO vo4 = new VO();

所以我们有:

+-----+              +----------------+
| vo1 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+
+-----+
| vo3 | (is null)
+-----+

+-----+              +----------------+
| vo4 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+
vo1.setName("Sourav");
vo2.setName("Anil");
+-----+              +----------------+
| vo1 |------------->| (object)       |
+-----+              | name = Sourav  |     *** change is here ***
                     +----------------+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = Anil    |     *** and here ***
                     +----------------+
+-----+
| vo3 | (is null)
+-----+

+-----+              +----------------+
| vo4 |------------->| (object)       |
+-----+              | name = null    |
                     +----------------+
vo3 = vo1;
vo4 = vo1;
+-----+
| vo1 |----\
+-----+     \
             \
+-----+       \      +----------------+
| vo3 |------------->| (object)       |
+-----+       /      | name = Sourav  |
             /       +----------------+
+-----+     /
| vo4 |----/
+-----+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = Anil    |
                     +----------------+
System.out.println(" " + vo4.getName());

...如你所料给了我们“Sourav”。

然后

 vo1.setName("Abhishek.");

...更改vo1vo3vo4都指向的对象:

+-----+
| vo1 |----\
+-----+     \
             \
+-----+       \      +----------------+
| vo3 |------------->| (object)       |
+-----+       /      | name = Abishek |
             /       +----------------+
+-----+     /
| vo4 |----/
+-----+

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = Anil    |
                     +----------------+
 类似资料:
  • 问题内容: 我从“ Head First Java”学习“多态”,然后想到了这个概念。有人可以举例说明吗? 编译器检查引用类型的类,而不是对象类型。 那么引用类型和对象类型之间有什么区别? 问题答案: 我认为它们对“对象类型”和“引用类型”的使用不是标准化的,但这是我的解释。 考虑以下代码: 该 引用 是类型的。它引用的 对象 是类型。 因此,“引用类型”为,“对象类型”为。 造成这种混乱的原因是

  • 问题内容: 我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。 那么两者之间有什么区别? 和 问题答案: 匹配项的实例,但不是。假设您要编写一个接受Strings到任何内容的映射的方法:如果您要编写 您无法提供。如果你写

  • 问题内容: 我是Kotlin的新手,最近将一个简单文件从Java转换为Kotlin。我想知道为什么Android转换器将我的java类更改为Kotlin对象。 Java: 转换的Kotlin: 为什么不呢? 任何帮助将不胜感激谢谢。 问题答案: Kotlin对象就像一个无法实例化的类,因此必须按名称进行调用。(本身是静态类) android转换器看到您的类仅包含静态方法,因此将其转换为Kotlin

  • 问题内容: 您能否简单地解释一下Transfer对象和Domain对象之间的区别?如果您可以举一个Java示例,那就太好了。 问题答案: DTO没有任何逻辑。他们只有字段(州)。在将数据从一个层/子系统传输到另一层/子系统时使用它们 域对象可以具有逻辑(取决于您使用的是域驱动设计还是贫乏的数据模型),并且它们通常与数据库结构相关。 如果使用贫乏的数据模型(即您的域对象没有任何逻辑),则DTO和域对

  • 问题内容: 这发生在python2.7中 我正在研究python中元类的想法,几乎所有教程都将对象引用为python中类的实例。但是,在使用类A():定义类的形式时,我看到了: 这意味着当从不是对象固有的类创建实例时,该实例是实例,但是当类是对象固有的类时,该类的实例是对象吗? 谁能解释其中的区别?在现实生活中,我应该使用哪一个? 谢谢! 问题答案: 这是新样式类和旧样式类之间的区别,在文档中对此

  • 问题内容: 我有类GUI,因此可以创建如下对象: 和像这样的参考变量: 现在,据我所知,g2是引用GUI类的引用变量,而g1是GUI类的对象。g1和g2有什么区别?我可以将GUI类的属性与对象一起使用,但是g2的可能用法是什么? 问题答案: 参考是名称。对象就是东西。您可以为事物使用不同的名称,即使对于实际上不存在的事物也可以使用不同的名称。 您可以声明名称,而无需实际给它们任何“真实的”含义,例