【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时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...
随机推荐
- 从Windows远程Ubuntu
关键字:Windows,Ubuntu,Putty,WinSCP OS:Windows 7,Ubuntu. 1.下载Putty:http://www.putty.org/. 2.双击运行putty.ex ...
- LINQ实战
转载:http://www.cnblogs.com/yubinfeng/p/4567064.html 原作者:尼古拉斯~yu 文章部分内容在原文的基础上有删改. 我相信在net进阶的这个阶段,很 ...
- JAVA 内存管理总结
1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对 ...
- 【一起学OpenFOAM】04 OpenFOAM的学习资源
OpenFOAM的学习资料并不多,个人猜测也许是与软件的类型有关系. 对于商用软件来讲,由于要占领市场,软件开发商自然是巴不得会用软件的人越多越好,因为他们卖的是软件,会用的人越多,软件卖得越好.他们 ...
- UICountingLabel实现数字变化的动画效果-b
在大多数金融类 app 上或者其他 app 需要数字展示的地方, 经常会有如下的动画效果: 动画效果 怎么做呢? 一.下载UICountingLabel 下载地址: https://github.co ...
- android下拉选择框spinner
spinner是什么东西呢?有点像下拉菜单,其实是一个弹出窗口,但是是可以进行进一步操作的弹出窗口.你点击那个三角形的符号,弹出一个窗口,通常是列表,然后进行操作. 它在xml文件中的定义和其它控件没 ...
- Web.xml配置详解之context-param(转)
本文转自:http://blog.csdn.net/liaoxiaohua1981/article/details/6759206 格式定义: <context-param> <pa ...
- Ubuntu14.04下如何开启Mysql远程访问
近来开发项目的需要,需要开启服务器下的Mysql远程访问权限(方法有很多),学习了一下,这里只演示个人觉得比较简单的一种方法. 对用户授权方法: 1. 在目录/etc/mysql下找到my.cnf,用 ...
- javaweb学习总结(四十一)——Apache的DBUtils框架学习
一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...
- 第四章 USB库介绍
4.1 USB库函数简介 Luminary Micro公司提供USB处理器的USB库函数,应用在Stellaris处理器上,为USB设备.USB主机.OTG开发提供USB协议框架和API函数,适用于多 ...