以Integer类型传参值不变来理解Java值传参

最近在写代码的时候出了一个错误,由于对值引用理解的不深,将Integer传入方法中修改,以为传入后直接修改Integer中的值就不用写返回值接收了,虽然很快发现了问题,但还是来总结一下

首先是代码:

public static void main(String[] args){
    Integer a1 = 5;
    updateInteger(a1);
    System.out.println(a1);
}

public static void updateInteger(Integer var){
    var = 10;
}

打印输出的结果是5,应该是毫无疑问的,可当时为什么我会认为a1应该是10呢?

大概是平时经常obj.integer = number习惯了,所以觉得操作了一个引用就可以修改对象里的值

当我执行var = 10 的值以后,由于jdk1.5自动装箱的特性,实际情况是等价于执行 var = Integer.valueOf(10);

valueOf()方法 参看源码 会根据传入的数值 如果在-128-127之间 就从常量池中获取一个Integer对象返回

如果不在范围内 会new Integer(var)返回

那么执行 var = 10以后

当时我天真的以为是操作了那个5变成了10

好了 ,这两张图已经足够说明Java传参为什么是值传参而不是引用传参了

总结一下:

值传参:将传入的值拷贝一份 ,比如传入int a = 5,并不会将变量a的地址传给方法

又或者传入对象类型Integer a1 =5 ,a1本身是个引用,传入方法后不会直接将a1这个引用传入,而是重新复制一份引用到方法参数中 ,有点绕 不理解? 想一下如果是将a1真实的传入上述的方法中,那就变成a1 = new Integer(10) ,结果就不一样了,变成下图所示,当然这是在JAVA中不可能的

引用传参:你可以理解为每次都把变量本身真实的传进去了,不管是个像int a这种引用地址的变量,还是像Integer a1这种引用对象的变量

public static void main(String[] 参数) {     
  AtomicInteger i=new AtomicInteger(40);
  i.intValue();
  System.out.println(i);
 }
    public static void change(AtomicInteger i) {
     i.set(55);
}

原文地址:https://www.cnblogs.com/zhaoyan001/p/11613066.html

时间: 2024-11-29 11:01:14

以Integer类型传参值不变来理解Java值传参的相关文章

深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

最近看了一下java 8的一些新特性,其中最重要的莫过于Lambda表达式了,通过一阵子的学习,原本准备自己写一篇博客的,后来阅读了一位学长翻译过来的博客(原文是Brain Goetz的State of Lambda,下面会给出原文链接),觉得写的十分完美,把我想要写的和我没想到的都罗列了出来,就把这个分享给大家了. 注:原译文见  http://lucida.me/blog/java-8-lambdas-insideout-language-features/ 英语原版见:http://cr.

java中返回值和参数理解

1.什么是对象,为什么需要对象? 对象是类的一个实例(对象不是找个女朋友),有状态和行为.万物皆对象! 2.什么是函数,为什么需要函数? 习惯把函数也叫成方法,都是一个意思:函数是具备特定功能的一段代码块,解决了重复性代码的问题.目的是为了提高程序的复用性和可读性. 3.什么是函数的返回值,什么是函数的参数? 函数返回值就是你所调用的函数返回给你的值.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效.实参:传递给被调用方法

动态查询的传参测试,关于#和$在Integer下传0..o(^▽^)o

做项目的时候发现mapper中的小问题于是我做了: /**int全部为Integer类型*/关于mybatis中的动态查询语句的小测试: 如果这样我的provId=0是传不进去的,当然用${provId}和#{provId}一样: SELECT * FROM app_home_custwhere 1=1<if test="provId != null and provId != ''"> AND prov_id = ${provId}</if>执行的sql[14

维度属性的KeyColumns如果是Integer类型,那么维度表中该列的值不能有为null的

如果维度属性的 KeyColumns的DataType设置为了Integer类型,那么要注意该维度属性列在数据库中不能有为null的值. 例如下图中我们有维度DIM_Vehcile,其中有个维度属性叫Vehicle Year,该属性的 KeyColumns的DataType设置为了Integer类型,如果现在数据库中DIM_Vehcile表的字段VehicleYear有为null的值,那么处理维度DIM_Vehcile时,会报Duplicate Key Error. 这是因为如果维度属性Vehi

C# 值类型,自定义值类型(struct,enum)

/*C#值类型 ValueType * 1.有两种自定义值类型:结构,枚举: * 2.值类型(value type)和引用类型(reference type):区别源于复制策略的不同,后者又造成每种类型在内存中以不同的方式存储.值类型:直接包含值,换句话说就是引用的位置就是值在内存中 * 实际存储位置,寻址方式就是直接寻址:值类型存储在栈里面,引用类型存储在堆里面,变量名称存储在栈里面:值类型需要一个内存副本: * 值类型传值得方式是复制:引用是共享同一块内存:引用类型的变量关联了两个存储位置:

Mybatis中,Integer类型参数值为0时得到 &quot;&quot;(空字符串)

今日遇到的问题: 查询版本信息时,由于version是Integer类型,所以当前台选择版本为0时,变成了查询了所有的版本信息. sql片段: </if> <if test="version != null and version != '' ">     AND a.version = #{version} </if> 原因: MyBatis因自身原因默认了 Integer类型数据值等于0时 为 ""(空字符串) 解决办法: 1

&lt;28&gt;【了解】10-枚举类型介绍及定义+【掌握】11-枚举变量变量定义和使用+【掌握】13-typedef定义新的类型+【掌握】15-宏的概念及无参宏定义方法+【掌握】16-有参宏定义和使用方法+【掌握】17-应用:使用有参宏求最大值+【掌握】18-typedef和#define的区别

[了解]10-枚举类型介绍及定义 枚举类型: C语言提供了一个种类型,这种类型的变量的取值被限定在一定的范围之内了 枚举类型的定义: enum 枚举类型名{ 枚举值1,枚举值2,.... }; 举例: 定义一个变量,保存一周的第几天 enum weekday{ zhouyi,zhouer,zhousan,zhousi,zhouwu ,zhouliu,zhouri }; 定义iPhone手机的颜色 关于枚举类型元素的命名习惯 enum iColor{kIcolorWhite,kIcolorBlac

java5核心基础之泛型(3)-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?

泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去. 怎样验证呢,贴代码例如以下: package highBasic.generic; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; public class StringAddToGeneri

标量类型与返回值类型声明

PHP 标量类型与返回值类型声明  PHP 7 新特性 标量类型声明 默认情况下,所有的PHP文件都处于弱类型校验模式. PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式: 强制模式 (默认) 严格模式 标量类型声明语法格式: declare(strict_types=1); 代码中通过指定 strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句:0表示弱类型校验模式. 可以使用的类型参数有: int float bool string inter