这个坑,是时候填上了...

简介: 一、背景​ 这两天,在网上逛的时候,发现了如下的一道面试题,感觉还有蛮有意思的,要是不仔细看还真容易掉到坑里面。第一眼看起来比较绕,所以比较难理解。

一、背景

​ 这两天,在网上逛的时候,发现了如下的一道面试题,感觉还有蛮有意思的,要是不仔细看还真容易掉到坑里面。第一眼看起来比较绕,所以比较难理解。最终我跳出了这个坑,也想把这个跳坑的经历分享出来。题目如下 , 请问输出的是什么?为什么?

/**
 * @author hafiz.zhang
 * @description: 一个奇怪的现象
 * @date Created in 2018/7/2 22:44.
 */
public class Test {
    public static void main(String[] args) {
        String ermao = "a";
        String bb = addStr(ermao);
        System.out.println(ermao);
    }

    private static String addStr(String ermao) {
        ermao = ermao + "b";
        return ermao;
    }
}

二、结果及原因

​ 毫无疑问,这道题的答案是:a , 你答对了么?在讲解原因之前,让我们想了解一点基础知识吧:

1. 值传递还是引用传递

​ 我们都知道Java中在传递参数的时候,分为值传递和引用传递两种类型。当参数为基本类型(Java八大基本类型:int、short、float、double、long、boolean、byte、char)的时候,就是值传递,当参数为封装类型(非基本类型,如Integer、Long、Boolean等)的时候,就是引用传递了。

2. Java内存模型中的堆和栈

​ 从Java的底层机制来说,基本类型的变量存放在栈里,封装类型中,对象放在堆里,对象的引用放在栈里。Java在方法传递参数时,是将变量复制一份,然后传入方法体去执行。

3. 答案是 a 的原因

因为String类型在传递过程中的步骤如下:

  1. 虚拟机在堆中开辟一块内存,并存值”a”。
  2. 虚拟机在栈中分配给ermao一个内存,内存中存的是1中的堆地址。
  3. 虚拟机复制一份ermao,我们就叫ermao’好了,ermao和ermao’在栈中的内存不同,但此时存的值都是1的堆地址。
  4. 将ermao’传入方法addStr中。
  5. 方法体在堆中开辟一块新内存,并存值”ab”。
  6. 方法体将ermao’的值改变,存入5中新的堆内存地址。
  7. 方法结束,方法外打印ermao,由于ermao存的是1中分配的堆地址,所有打印结果还是”a”。

还不清晰?没关系,那我们直接上个图会不会来得更直观:

三、总结

​ 通过本文我们就理解了Java在方法传参的整个过程。其实还是上面那句比较重要的话: Java在方法传递参数时,是将变量复制一份,然后传入方法体去执行。
原文链接:https://www.imooc.com/article/40817
转载请注明出处,谢谢合作

目录
相关文章
|
10月前
|
人工智能 安全 Java
Java接入AI大模型:框架助力与实践指南
JBoltAI是面向Java生态的AI大模型接入框架,提供统一API、多模型适配、工程化部署与安全管控能力,支持RAG知识库集成和异步高并发处理,显著降低Java企业数智化升级门槛。(239字)
479 2
|
机器学习/深度学习 设计模式 人工智能
workflow is all you need?探讨乐高式流程编排能否实现任意Multi-Agent模式
阿里集团安全部探索利用AI工作流(workflow)构建多智能体系统(MAS),以提升网络安全领域的创造性协作能力。文章围绕“Workflow is All You Need”这一核心观点,分析当前主流AI Workflow产品是否具备支持多种MAS协作模式的能力。通过Dify等工具演示了单Agent、路由、顺序执行、主从控制、反思、辩论、群聊等多种典型协作模式的实现方式,并指出现有平台在异步交互、动态扩展及并行化MOA模式上的局限性。最终强调,尽管目前尚存挑战,但AI Workflow仍是快速搭建多智能体系统的有效路径。
workflow is all you need?探讨乐高式流程编排能否实现任意Multi-Agent模式
linux文件重命名命令
本指南介绍Linux文件重命名方法,包括单文件操作的`mv`命令和批量处理的`rename`命令。`mv`可简单更改文件名并保留扩展名,如`mv old_file.txt new_name.txt`;`rename`支持正则表达式,适用于复杂批量操作,如`rename 's/2023/2024/' *.log`。提供实用技巧如大小写转换、数字序列处理等,并提醒覆盖风险与版本差异,建议使用`-n`参数预览效果。
|
前端开发 JavaScript 开发者
【第48期】一文了解React几个流行的工具和库
【第48期】一文了解React几个流行的工具和库
356 0
|
存储 算法
数据结构之栈
  内存可以分为动态内存和静态内存; 动态分配是在栈中分配的,静态分配是在堆中分配; “栈”和”堆“的区别在本质上只是操作系统分配内存时,分配的方式不用,从而形成“栈”,”堆“; “堆”是以堆排序的方式分配的内存,“栈”是以压栈、出栈方式分配; 定义:   一种可以实现“先进后出”的存储结...
1039 0
|
13天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
5606 42
|
14天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
4846 58
|
8天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
2181 6
|
6天前
|
人工智能 安全 API
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(dsh)是DeepSeek AI于2026年开源的轻量级Agent运行框架,基于Cordis内核,践行“一切皆插件”理念。支持Web/桌面双端,开箱即用;内置多模型接入、丰富插件生态(超3.5万),适配编程、办公、创作等场景。(239字)
1345 0
|
14天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
2300 7