java中对象和引用的区别与代码?

2024-04-17

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.

VO 是一个简单的类,包含字符串名称并包含getter and setter.

在第一个系统输出打印文件 *vo4.getName()* 打印 :Sourav好的,没关系。

但在第2次系统输出打印文件 *vo4.getName()* 打印 :阿布舍克。

我的问题是为什么第二次打印是阿布舍克。。我在 vo4 对象中保留了 vo1 对象的副本,而不是引用。这意味着它创建了一个新的记忆。 vo1和vo4是不同的。那为什么第二次改变了vo4.getName呢?我正在设置 vo1 对象,但 vo4 会自动更改。为什么会这样?


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

不,你已经指出了变量vo1 and vo4 at the same对象,像这样:


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

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

VO vo1 = new VO();

给我们:


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

Then:

VO vo2 = new VO();

现在我们有:


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

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

Then:

VO vo3;

...这只会创建vo3 with null(不指向任何物体)。

Then:

VO vo4 = new VO();

所以我们有:


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

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

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

Now:

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;

那点vo3在同一个物体上vo1指向,并指向vo4也针对那个物体,释放物体vo4用于指向(有资格进行垃圾收集)。给我们:


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

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = Anil    |
                     +----------------+  

Now

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

...如您所料,给我们“Sourav”。

Then

 vo1.setName("Abhishek.");

...改变对象vo1, vo3, and vo4都指向:


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

+-----+              +----------------+
| vo2 |------------->| (object)       |
+-----+              | name = Anil    |
                     +----------------+  

...所以getName() on vo1, vo3, or vo4会给你“Abishek”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中对象和引用的区别与代码? 的相关文章

  • 无法在 Spring boot 中使用 @Valid 验证请求正文

    我想验证我的请求正文 Valid注解 但在 Spring Boot 中不起作用 我在 JAR 文件中有一个 Request 类 无法使用两个字段进行修改 其中一个字段的类型为对象 我的控制器类接受此类对象作为请求主体 当我将下面的 JSON
  • 如何从 TextInputLayout 中删除底部填充

    第一张图就是我想要的 第二张图是我实现的 正如您所看到的 TextInputLayout 的底部有一个填充 这使得灰色背景溢出超过 edittext 行 请不要建议负边距或填充 因为它在较新的 API 中不起作用 这是我为第一个文本输入布局
  • 如何指定嵌套属性的默认值?

    当我没有指定值时 以下代码会抛出 NPEacme security roles ConstructorBinding ConfigurationProperties acme public class AcmeProperties priv
  • 使用两个不同的泛型参数调用泛型函数仍然可以编译

    下面的代码怎么可能编译通过 据我所知 count 函数是用两种不同的类型调用的 但编译器并没有抱怨并愉快地编译了这段代码 public class Test public static
  • 我是否应该将 CachingConnectionFactory 与 hornetq 2.4.1 一起使用

    根据有关在 hornetq 中使用 JMSTemplate 的长期信息 我们在连接到服务器时一直使用 CachingConnectionFactory 这是一个示例配置 与我们正在使用的配置非常相似
  • flink - 使用匕首注入 - 不可序列化?

    我使用 Flink 最新通过 git 从 kafka 流式传输到 cassandra 为了简化单元测试 我通过 Dagger 添加依赖注入 ObjectGraph 似乎已正确设置自身 但 内部对象 被 Flink 标记为 不可序列化 如果我
  • 在 LibGDX 中保存和检索图像文件

    如何在 LibGDX 中保存和检索图像文件 我想将图像文件保存在 AndroidApplication 类的本地存储中 并在我的 Core 项目中检索它 Libgdx 中的文件处理在libGDX 维基 https github com li
  • XMLEncoder 和 XStream 的相对优势是什么?

    假设我想用XML存储许多小的配置对象 并且我不太关心格式 这XML解码器 http java sun com j2se 1 5 0 docs api java beans XMLDecoder htmlJDK 中内置的类可以工作 据我所知
  • 如何从 ScheduledExecutorService 中删除任务?

    我有一个ScheduledExecutorService定期执行一些不同的任务scheduleAtFixedRate Runnable INIT DELAY ACTION DELAY TimeUnit SECONDS 我也有不一样的Runn
  • 并发 log4j

    我有自己的日志引擎 它将日志写入带有阻塞队列的单独线程上 为了使用 标准软件 我正在考虑切换到 log4j 我不希望我的高并发软件因日志命令而变慢 这些日志命令在调用命令时将所有内容写入磁盘 log4j 可以用作垃圾箱吗 Log4j 是大多
  • Java正则表达式以数字和固定长度开头的字符串

    我制作了一个正则表达式来检查 String 的长度 所有字符都是数字并以数字开头 例如 123 以下是我的表情 REGEX 123 d 9 但它无法检查字符串的长度 它仅验证那些长度为 9 并以 123 开头的字符串 但如果我传递字符串 1
  • 模拟网络断开连接以在本地测试分布式应用程序分区

    我有几个在本地主机上运行的分布式应用程序实例 每个实例都通过某些端口与其他实例通信 所有实例一起构成一个整体 我实际上是在谈论动物园管理员 http hadoop apache org zookeeper 在 Linux 上运行 现在我想编
  • 在eclipse中的另一个项目中使用一个项目的包

    如何在定义包的主项目之外使用包的类 例如 假设 people 包中有一个属于 ProjectOne 的 Employee 类 假设另一个具有相同功能的项目 ProjectTwo 需要 Employee 我应该在那里做什么 在 Package
  • ClassCastException:ApiVersionImpl 无法转换为 java.lang.Integer

    我有 android gradle 项目 当我尝试启动应用程序时出现以下异常 ClassCastException com android build gradle internal model ApiVersionImpl cannot
  • Java 应用程序中 PKIX 路径构建失败

    将应用程序从 Windows 2000 迁移到 Windows 2008 R2 Server 后 我花了将近一周的时间才让我的应用程序正常运行 步骤 安装Java JDK 1 7 0 25 设置系统环境变量JAVA HOME to C Pr
  • 有没有办法在 Eclipse 中自动附加非 JRE 包的 Javadoc?

    首先 这与 Java SE Javadocs 无关 效果很好 我们有一个基于 Java 的大型平台 包含大约 20 个 API 包 对于使用我们平台的用户 我们希望工具提示和其他此类内置文档支持能够像 Java API 那样工作 我们的 J
  • 像耐心/克朗代克纸牌游戏一样拖动节点

    我正在做克朗代克游戏 逻辑一切正常 我只是在使用 javafx 中的 UI 时遇到问题 我一直在尝试从 桌面堆 周围移动 拖动卡片 但没有达到预期的结果 我的卡片是一个 ImageView 里面有一个图像 这些卡片位于窗格内 Pane ta
  • Java 中客户端/服务器传输的压缩字符串

    我使用专有的客户端 服务器消息格式来限制我可以通过网络发送的内容 我无法发送序列化对象 我必须将消息中的数据存储为字符串 我发送的数据是大的逗号分隔值 我想在将数据作为字符串打包到消息中之前对其进行压缩 我尝试使用 Deflater Inf
  • 变量范围的 Java 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以指导我查看 java 文档以了解变量的范围 我想查看 java 8 中的类变量和成员变量的
  • Maven 依赖项插件无法解析插件的手动指定依赖项

    我遇到了一个问题maven dependency plugin Maven版本3 2 3 maven dependency plugin版本2 10 我正在尝试引入插件依赖项 我创建了一个简单的项目

随机推荐