Java 参数的值传递和引用传递
在Java中,方法的参数的传递分为值传递(基本数据)和引用传递(引用数据:对象、字符串),这是最容易接受的。如果你能知道有这两种情况存在,那么,在遇到调用方法时,你可以避免很多问题的产生。但是,仔细查阅资料发现,Java中只有值传递。那么你会问,那为什么还叫引用传递呢?这让我想弄明白到底,方法执行过程中,参数是怎么使用的。
Java只有值传递
这里我准备了一个事例用来分析,如下:
@Test
public void Test2() {
A a = new A("apple");
int b = ; System.out.println();
System.out.println("方法执行前:");
System.out.println(a.toString());
System.out.println(b); testParam(a, b); System.out.println();
System.out.println("方法执行后:");
System.out.println(a.toString());
System.out.println(b);
} private void testParam(A a1, int b1) {
a1.setName("banana");
b1 = ; System.out.println();
System.out.println("方法中:");
System.out.println(a1.toString());
System.out.println(b1);
} class A {
private String name; public A(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "A{" +
"name='" + name + '\'' +
'}';
}
}
输入结果:

1:首先,所有的方法在调用时,参数都会进行拷贝。
想理解这句话,我觉得很有必要先弄懂 栈内存 和 堆内存。首先,java中的基本数据类型 和 指针(指针是指向一块内存地址的内存数据,也就是说指针本身是一个占用4字节内存的int(32 位系统内))都是存放在 栈内存 中的。所以,当方法被调用时,基本数据类型 和 指针 都进行了拷贝。

也就是说,引用传递实际上也是对栈内存中的指针进行拷贝。
所谓传引用的说法是为了更好的区别基本数据类型,理解其调用方式。基于上面对指针的理解,我们不难看出,指针其实也是一个int值,所谓传引用,我们是复制了指针的int值进行传递。为了便于理解,我们可以姑且把指针看作一种数据类型,透明化指针的int特性,从而提出传引用的概念。
在Java中,很多人说没有指针,事实上,在Java更深层次里,到处都是大师封装好的精美绝伦的指针。为了更容易的讲解Java中关于类和类型的调用,Java中出现了值与引用的说法。浅显的来说,我们可以认为Java中的引用与C中的指针等效。
加餐
提问:如果传一个String字符串作为参数,并在方法中对字符串参数进行修改。站在 String字符串 是引用数据类型的前提下,那么你认为,在方法调用前和调用后,值会是一致的吗?
@Test
public void Test2() {
String str = ""; System.out.println("方法执行前:");
System.out.println(str); testString(str); System.out.println();
System.out.println("方法执行后:");
System.out.println(str);
} private void testString(String str1) {
str1 += ""; System.out.println();
System.out.println("方法中:");
System.out.println(str1);
}
如果你回答不一致,那么只能说,上面的你确实听懂了。不过,字符串这块的知识你需要再更深入的学习了。╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮
输入结果:

咦,怎么字符串str没有因为参数字符串str1的改变而改变呢?难道,参数str1没有修改str的堆内存内容吗,往这方面思考是对的,它确实没有修改。
这里需要讲一个我们听过最多的,但是在用的时候又想不起来的知识点:字符串不能修改。
通过反编译字节码文件,可以看到,字符串在进行 + 运算符时,新建了一个 StringBuild对象,通过 该对象的 append() 方法进行字符串的拼接,然后通过 toString() 方法返回一个新的堆内存地址。所以str1 指向的是新的堆内存地址。

终于,对于Java 参数的传递问题,应该都明白了。( ^_^ )/~~拜拜
欢迎大家评论与交流,加油!!
【参考】
Java 参数的值传递和引用传递的更多相关文章
- 【Java】 参数的传递:值传递与引用传递讨论
内容稍多,可直接看第4点的讨论结果 前言 在涉及到传递参数给方法时,容易出现一些参数传递错误的问题,这就涉及到了参数的传递问题,必须搞清楚:参数是如何传递到方法中的?一般来说,参数的传递可以分为两种: ...
- Java调用函数传递参数到底是值传递还是引用传递
今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...
- 辨析Java方法参数中的值传递和引用传递
小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...
- JAVA方法中参数到底是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java的值传递和引用传递
昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- java 对象传递 是 值传递 还是 引用传递?
这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...
随机推荐
- Spring Boot → 01:概要
背景 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML. 在二十世纪初期,新兴Java技术——Spring,横空出世.使用极简XML和POJO(普通J ...
- C++ 之手写memcpy
#include<iostream>#include<cstdio>using namespace std; void* mymemcpy(void* dst, const v ...
- java jsp j2ee
1. JavaScript用于编写嵌入在网页文档中的程序,它由浏览器负责解释和执行,可以在网页上产生动态的显示效果和实现与用户交互的功能,譬如,让一串文字跟着鼠标移动,让一个图标在网页漂浮移动,验证用 ...
- PYTHON网络爬虫与信息提取[scrapy框架应用](单元十、十一)
scrapy 常用命令 startproject 创建一个新的工程 scrapy startproject <name>[dir] genspider 创建一个爬虫 ...
- Mybatis中example类的使用
要使用example类,先要在项目中导入mybatis.mapper的jar包. Mapper接口中包含了单表的增删改查以及分页功能. 给出实例: CountryMappermapper = sqlS ...
- 聊聊jdk http的HeaderFilter
序 本文主要研究一下jdk http的HeaderFilter. FilterFactory java.net.http/jdk/internal/net/http/FilterFactory.jav ...
- iOS 微信支付如果遇到跳转只有一个确定请看这里
http://www.cocoachina.com/bbs/read.php?tid-321546.html 今天在联调微信支付,不得不说,和它比起来,阿里的支付sdk真的是太好用了.果然和后端同学在 ...
- PHPCMS快速建站系列之邮箱验证
1. 登录163邮箱,->设置,开启POP3服务->把SMTP服务器地址复制到PHPCMS后台. 2.开启客户端授权密码 3.填写相关信息,.可以在测试邮箱填入邮箱地址测试
- 未能加载文件或程序集 XXX 或它的一个依赖项。参数错误
引发原因 :电脑突然蓝屏重启 解决方法:删除 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 下的所有文件 ...
- Maven学习总结--maven入门(一)
一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理.