【Java基础】基本类型的包装类作为参数传递是值传递还是引用传递
突然想到这个问题,然后做了下实验,下面以Integer来讲解,其他的忽略:
import java.util.Iterator; /**
* Created by lili on 15/9/24.
*/
public class TestNew {
public static void main(String args[]){ Integer i1 = 10;
Integer i2 = 20;
System.out.println(i1 + " " + i2);
change(i1,i2);
System.out.println(i1 + " " + i2); String s1 = new String("s1");
String s2 = new String("s2");
System.out.println(s1 + " " + s2);
change(s1, s2);
System.out.println(s1 + " " + s2); StringBuilder sb1 = new StringBuilder("sb1");
StringBuilder sb2 = new StringBuilder("sb2");
System.out.println(sb1 + " " + sb2);
change(sb1,sb2);
System.out.println(sb1 + " " + sb2); } public static void change(Integer i1, Integer i2){
i1 = 100;
i2 = 200;
} public static void change(String i1, String i2){
i1 = "ii1";
i2 = "i22";
} public static void change(StringBuilder i1, StringBuilder i2){
i1.append("sbsbsb1");
i2.append("sbsbsb2");
}
}
运行结果:
10 20
10 20
s1 s2
s1 s2
sb1 sb2
sb1sbsbsb1 sb2sbsbsb2 Process finished with exit code 0
事实证明,只有StringBuilder是引用传递,其他的还是值传递。
按照常理,应该传递的是对象的地址,难道这里是因为做了自动装箱和拆箱,编译器帮你做了这个导致最后是值传递了?
带着这个问题首先去看了class文件的反编译代码:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// public class TestNew {
public TestNew() {
} public static void main(String[] var0) {
Integer var1 = Integer.valueOf(10);
Integer var2 = Integer.valueOf(20);
System.out.println(var1 + " " + var2);
change(var1, var2);
System.out.println(var1 + " " + var2);
String var3 = new String("s1");
String var4 = new String("s2");
System.out.println(var3 + " " + var4);
change(var3, var4);
System.out.println(var3 + " " + var4);
StringBuilder var5 = new StringBuilder("sb1");
StringBuilder var6 = new StringBuilder("sb2");
System.out.println(var5 + " " + var6);
change(var5, var6);
System.out.println(var5 + " " + var6);
} public static void change(Integer var0, Integer var1) {
var0 = Integer.valueOf(100);
var1 = Integer.valueOf(200);
} public static void change(String var0, String var1) {
var0 = "ii1";
var1 = "i22";
} public static void change(StringBuilder var0, StringBuilder var1) {
var0.append("sbsbsb1");
var1.append("sbsbsb2");
}
}
源代码显示并没有做值传递的优化,因为如果做了,应该change中的参数会改为int,这样一来Integer对象会自动拆装为int进行值传递,一种自动装卸拆箱的代码示例如下:
Integer integer = 11;
integer += 9; /*
Integer integer = Integer.valueOf(11);//自动装箱
integer = Integer.valueOf((integer.intValue() + 9));//自动拆箱再装箱
*/
那究竟是什么原因呢?
带着这个问题,对程序进行了debug,看看传递的是否是对象地址。

进入change方法后,看地址的变化

发现传入的是地址值,change参数的i1和i2的对象指向Integer@417和Integer@418,说明指向和传入参数的同一个对象,传入的是地址。
接着执行方法change程序:

执行改变i1的值时,此时i1指向的对象改为了Integer@427,至此可以充分说明不是自动装箱和拆箱的问题了,但是究其原因,我的理解还是和这个相关,因为执行到这一步的时候是i1 = 100;但是具体编译器优化后做了自动装箱处理,var0 = Integer.valueOf(100);所以i1指向了Integer.valueOf(100)这个新产生的对象,所以最后和值传递的效果一样,不会改变调用该方法的参数的值。
【Java基础】基本类型的包装类作为参数传递是值传递还是引用传递的更多相关文章
- java中参数传递--值传递,引用传递
java中的参数传递——值传递.引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用. ...
- Java参数传递是值传递还是引用传递?
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...
- Java的参数传递是值传递还是引用传递?
一.前言 首先先说结论,Java中方法参数传递方式是按值传递.如果参数是基本类型,传递的是基本类型的字面量值的拷贝.如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝. 接下来深入了解一 ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- java基础 - 形参和实参,值传递和引用传递
形参和实参 形参:就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的. 形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元. 因此,形 ...
- Java是值传递还是引用传递?
Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...
- 堆栈详解 + 彻底理解Java的值传递和引用传递
本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
随机推荐
- python初准备:安装easy_install和pip
安装easy_install wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py 安装pip wget htt ...
- Hadoop常见的45个问题解答
(大讲台:国内首个it在线教育混合式自适应学习) 1.Hadoop集群可以运行的3个模式 单机(本地)模式 伪分布式模式 全分布式模式 2. 单机(本地)模式中的注意点? 在单机模式(standal ...
- 【Http】Http权威指南
God Is Coder 2012-10-17 22:25 阅读:77 评论:0 <http权威指南>阅读笔记(十二) God Is Coder 2012-10-17 22:04 阅读 ...
- 更改Keil工程名
假设原工程名为A,需要改成B. 1, 在工程目录下,把A.vuopt和A.uvproj改成B.uvopt和B.uvproj. 2,删除其他A文件. 3,打开工程B.然后修改下面位置: Project ...
- 求解 s = (1*1)!+(2*2)! + (3*3)!+...+(n*n)! (C语言)
提示:定义函数可以求阶乘,再定义函数求阶乘之和.1和0的阶乘是1,n(n > 1)的阶乘是n * (n-1) * (n - 2) * … * 1 //采用了函数嵌套调用和函数递归调用 //求解阶 ...
- 什么是 DevSecOps?系列(一)
什么是 DevSecOps? 「DevSecOps」 的作用和意义建立在「每个人都对安全负责」的理念之上,其目标是在不影响安全需求的情况下快速的执行安全决策,将决策传递至拥有最高级别环境信息的人员. ...
- 练习--LINUX进程间通信之消息队列MSG
https://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 继续坚持,或许不能深刻理解,但至少要保证有印象. ~~~~~~~~~~~~~~ 消息队 ...
- 怎么修改tomcat默认访问首页
一般情况下安装好tomcat之后我们的默认访问首页是index了,但我们如果要修改或增加一个默认首页,我们可参考下面办法来解决. 通过 ip:port 访问到的是 tomcat 的管理页面,其他常规部 ...
- 《ArcGIS Engine+C#实例开发教程》第四讲 状态栏信息的添加与实现
原文:<ArcGIS Engine+C#实例开发教程>第四讲 状态栏信息的添加与实现 摘要:在上一讲中,我们完成了 MapControl 和PageLayoutControl两种视图的同步 ...
- Android TextView自动实现省略号
TextView自带的可以通过 android:ellipsize="end" android:singleLine="true"实现单行省略, 但是当我们需 ...