Java参数传递及值传递实现原理详解
java方法参数的传递有两种,值传递和引用传递。
1.按值传递:
参数类型是int,long等八大基本数据类型时,参数传递的过程是按值拷贝的过程
如下代码
public static void main(String[] args) { int a = 5; fun(a); System.out.println(a);// 输出结果为5 } private static void fun(int a) { a += 1; }
2.按引用传递
参数类型为引用类型,参数传递的过程采用拷贝引用的方式
public class Test { public static void main(String[] args) { A a = new A(5); fun(a); System.out.println(a.a);// 输出结果为6 } private static void fun(A a) { a.a += 1; } static class A { public int a; public A(int a) { this.a = a; } } }
再看下面这种情况:
public class Test { public static void main(String[] args) { Integer a = 5; fun(a); System.out.println(a);// 输出结果为5 } private static void fun(Integer a) { a += 1; } }
这里明明是引用传递,为什么没有改变对象的值呢?
这里其实使用了基本数据类型封装类的自动装箱功能。
Integer a = 5,编译后实际为Integer a = Integer.valueOf(5),查看Integer的源码,并没有改变原对象的值,只是将其引用指向了另一个对象。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
Java方法的参数传递机制实例详解
本文实例讲述了Java方法的参数传递机制.分享给大家供大家参考,具体如下: 参数传递机制 对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递. 按值传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的一个副本.因此,如果方法修改了该参数,仅改变副本,而原始值保持不变.按引用传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的内存地址,而不是值的副本.因此,如果方法修改了该参数,调用代码中的原始值也随之改变. 需要注意的是,方法可以修改按引用传递的参数对应
-
java 中函数的参数传递详细介绍
java中函数的参数传递 总结: 1.将对象(对象的引用)作为参数传递时传递的是引用(相当于指针).也就是说函数内对参数所做的修改会影响原来的对象. 2.当将基本类型或基本类型的包装集作为参数传递时,传递的是值.也就是说函数内对参数所做的修改不会影响原来的变量. 3.数组(数组引用))作为参数传递时传递的是引用(相当于指针).也就是说函数内对参数所做的修改会影响原来的数组. 4.String类型(引用)作为参数传递时传递的是引用,只是对String做出任何修改时有一个新的String
-
java 直接调用python脚本,并传递参数代码实例
最近陆续用python写了很多文件处理脚本,虽然功能都比较简单 ,但还是感觉到python对文件处理的简洁高效 ,越发觉得java的语法相当的繁琐~ 接到个需求处理ftp数据接口 .所以想把python脚本也用上.java代码定时扫描ftp数据仓库 ,调用python脚本入库. 直接采用java执行系统命令的方式 @Async public void readFileByPython(List<String> filePaths) throws FileNotFoundException {
-
Java中前台往后台传递多个id参数的实例
1.传字符串的形式,字符串中每个id用 "," 隔开 打印出来如下形式: 前台JS代码 function saveRoleAdd() { var roleNames = $('#roleNames').textbox("getText"); var roleDetail = {}; roleDetail.roleNames = roleNames; roleDetail.roleFunctionCount = 0; roleDetail.roleFunctionLi
-
简单谈谈Java中String类型的参数传递问题
提要:本文从实现原理的角度上阐述和剖析了:在Java语言中,以 String 作为类型的变量在作为方法参数时所表现出的"非对象"的特性. 一.最开始的示例 写代码最重要的就是实践,不经过反复试验而得出的说辞只能说是凭空遐想罢了.所以,在本文中首先以一个简单示例来抛出核心话题: public class StringAsParamOfMethodDemo { public static void main(String[] args) { StringAsParamOfMethodDem
-
在java中实现C#语法里的按引用传递参数的方法
在C#中,在次函数中调用时改变了其中的数值,主函数中也将发生改变 ref 关键字使参数按引用传递.其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中.若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字 out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化.若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字. Java里面不像C#那样,Java只有对象类
-
Java数组传递及可变参数操作实例详解
本文实例讲述了Java数组传递及可变参数操作.分享给大家供大家参考,具体如下: 方法可以操作传递和返回基本数据类型,但是方法中也可用来传递和返回数组.如果要向方法中传递一个数组,则方法的接收参数处必须是符合其类型的数组.而且数组属于引用数据类型,所以在把数组传递进方法之后,如果方法对数组本身做了任何修改,修改结果都是会保存下来的. 向方法中传递数组 在java中,所有对象都是通过引用进行操作的.而数组也是一种对象,当把数组作为参数传递给方法时,传递的实际上就是数组对象的引用.在方法中对数组的所有
-
Java参数传递及值传递实现原理详解
java方法参数的传递有两种,值传递和引用传递. 1.按值传递: 参数类型是int,long等八大基本数据类型时,参数传递的过程是按值拷贝的过程 如下代码 public static void main(String[] args) { int a = 5; fun(a); System.out.println(a);// 输出结果为5 } private static void fun(int a) { a += 1; } 2.按引用传递 参数类型为引用类型,参数传递的过程采用拷贝引用的方式
-
java参数传递之值传递和引用传递
值传递 当调用方法进行值传递时,方法内部会产生一个局部变量,在方法内部使用局部变量的值,并不影响传入原来数据的值,包括在使用基本数据类型的包装类. public class Assc { public static void main(String[] args) { int x1=1; add(x1); System.out.println("最终"+x1);//1 Integer x2=new Integer(1); sub(x2); System.out.println(&quo
-
java并发等待条件的实现原理详解
前言 前面介绍了排它锁,共享锁的实现机制,本篇继续学习AQS中的另外一个内容-Condition.想必学过java的都知道Object.wait和Object.notify,同时也应该知晓这两个方法的使用离不开synchronized关键字.synchronized是jvm级别提供的同步原语,它的实现机制隐藏在jvm实现中.作为Lock系列功能中的Condition,就是用来实现类似 Object.wait和Object.notify 对应功能的. 使用场景 为了更好的理解Lock和Condit
-
Java基础学习之反射机制原理详解
目录 一.什么是反射 二.反射的原理 三.反射的优缺点 四.反射的用途 五.反射机制常用的类 六.反射的基本使用 一.什么是反射 (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息. (2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM.通过反射,可
-
Java原生操作JDBC连接以及原理详解
一.简介 JDBC全称又叫做Java DataBase Connectivity,也就是Java数据库连接,说白了就是用Java语言来操作数据 库,提供统一API访问数据库操作. 二.原理 JDBC主要是用于java连接数据库的,能连接什么数据库不固定,其实能连接很多种数据库,而且一般来说可以连接oracle和mysql,通常也是这两种.但是既然JDBC能连接这么多的数据库,开发起来太麻烦了,于是sun公司那些人想出了一个办法,我定义一套规范,大家都按照这个规范来,实现自己公司访问数据库的实现.
-
Java类加载机制实现流程及原理详解
前言 我们知道,Java项目编译后会生成许许多多的class文件,class文件保存着类的描述信息.虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转化解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存位置,他的整个生命周期包括: 加载验证准备解析初始化使用卸载 这七个阶段.画个图就是下面这样: 其中,类加载的过程包括了加载.验证.准备.解析.初始化这五个阶段.其中加载.验证.准备.初始
-
java ConcurrentHashMap锁分段技术及原理详解
一.背景: 线程不安全的HashMap 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 效率低下的HashTable容器 HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下.因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态.如线程1使用put进行添加元素,线程2不但不能
-
Java多线程实现四种方式原理详解
1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3.通过Callable和FutureTask创建线程 4.通过线程池创建线程 前面两种可以归结为一类:无返回值,原因很简单,通过重写run方法,run方式的返回值是void,所以没有办法返回结果 后面两种可以归结成一类:有返回值,通过Callable接口,就要实现call方法,这个方法的返回值是Object,所以返回的结果可以放
-
Java synchronized偏向锁的核心原理详解
目录 1.偏向锁的核心原理 2.偏向锁的撤销 3.偏向锁的膨胀 4.偏向锁的好处 总结 1. 偏向锁的核心原理 轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS 操作. Java 6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现 这个线程 ID 是自己的就表示没有竞争,不用重新 CAS.以后只要不发生竞争,这个对象就归该线程所有. public class Main { static final Objec
-
Java synchronized轻量级锁的核心原理详解
目录 1.轻量级锁的原理 2.轻量级锁的分类 1.普通自旋锁 2.自适应自旋锁 3.轻量级锁的膨胀 总结 问题: 什么是自旋锁? 说一下 synchronized 底层实现原理? 多线程中 synchronized 锁升级的原理是什么? 1. 轻量级锁的原理 引入轻量级锁的主要目的是在多线程竞争不激烈的情况下,通过CAS机制竞争锁减少重量级锁产生的性能损耗.重量级锁使用了操作系统底层的互斥锁(Mutex Lock),会导致线程在用户态和核心态之间频繁切换,从而带来较大的性能损耗. 轻量级锁的使用
随机推荐
- 浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
- Windows2008初次体验的几个心得图文
- ASP.NET MVC 4使用PagedList.Mvc分页的实现代码
- JS实现在线统计一个页面内鼠标点击次数的方法
- Javascript Event事件中IE与标准DOM的比较
- 试用php中oci8扩展
- 详解Python的Django框架中manage命令的使用与扩展
- Python简单操作sqlite3的方法示例
- CSS2实现的隔行换色
- Java窗体居中显示的2种方法(实例讲解)
- cpu时钟预取实例代码分享
- jQuery表格列宽可拖拽改变且兼容firfox
- 添加到收藏夹代码(兼容几乎所有的浏览器)
- 浅谈Windows系统下C语言编程中Glib库的使用
- php中计算时间差的几种方法
- C#实现在图像中绘制文字图形的方法
- Python实现的计数排序算法示例
- Vue-cli项目获取本地json文件数据的实例
- 一些你可能不熟悉的JS知识点总结
- android开机自启动APP及使用adb命令测试方法