Java函数的传参机制
一
最近的一个项目,里面各种返回void,参数用引用类型,那叫一个熟和多,但是也把我绕糊涂了。
我就打算好好理一理java的传参机制,整理一番
二
很多人一听Java的传参,那一定会脱口而出,java都是值传递的。恭喜各位,答对了。
那么,传的是什么值?
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
三
public class ParamterTest {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
list1.add(0);
list2.add(0); //(1)
f(list1, list2);
System.out.println("list1 2");
p(list1);
System.out.println("list2 2");
p(list2); //(4)
}
public static void f(List<Integer> list1, List<Integer> list2) {
list1.add(1);
list2.add(1);
list2 = new ArrayList<>(); //(2)
list1.add(2);
list2.add(2);
System.out.println("list1 1");
p(list1);
System.out.println("list2 1");
p(list2); //(3)
}
public static void p(List<Integer> list) {
for (Integer i : list) {
System.out.println(i);
}
}
}
输出结果
list1 1
0
1
2
list2 1
2
list1 2
0
1
2
list2 2
0
1
四
要具体解释,就是涉及到堆,栈和方法区了。
(1)list1,list2刚刚成立,都放进了 0,因为是对象的实例所以保存在堆里面。
(2)list1,list2将自己堆的地址传到了方法里,因为是引用所以保存在栈里面,并通过地址往堆里面的实例,放进了 1。但是,此时new了一个实例,list2在栈里面不再指向堆的实例,而是一个新的地址。
(3)list1,list2放进了2,但此处list1依然指向堆的实例,故放进了 2,而list2则是新的地址,堆的list2并没有放进 2。
(4)方法结束,返回的结果使堆的list1,放进了 1 , 2 。list2 因为在方法内中途有新的实例, 只放进了 1 ,而没有 2。
五
其实一直迷惑我们,是我们判断出错的是String ,明明是一个引用类型,却是基本类型的特性,因为String 实际上是[]char,具体不细说,我就丢个代码,让大家跑跑吧。
public class ParamterStringTest {
public static void main(String[] args) {
String s1 = "a";
String s2 = "a";
f(s1, s2);
System.out.println("s1 2");
p(s1);
System.out.println("s2 2");
p(s2);
}
public static void f(String s1, String s2) {
s1 = "b";
s2 = "b";
System.out.println("s1 1");
p(s1);
System.out.println("s2 1");
p(s2);
}
public static void p(String s) {
System.out.println(s);
}
}
同理,相应的Interge等包装类。
Java函数的传参机制的更多相关文章
- Java的对象传参问题
在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.之前有搜过相关的知识点一直理解的是:Java的传参方式中主要有两种: ...
- java复用和传参
java复用和传参的三种方法总结: (1) 直接在一个类中调用函数 : 1 package test1; 2 3 public class a 4 { 5 public static void get ...
- uboot向kernel的传参机制——bootm与tags
http://blog.csdn.net/skyflying2012/article/details/35787971 最近阅读代码学习了uboot boot kernel的过程以及uboot如何传参 ...
- C#为什么不能像C/C++一样的支持函数只读传参
C#为什么不能像C/C++一样的支持函数只读传参? 这个问题其实问的人挺多的,我自己也经常想实现这个功能,但是发现总是那么的不尽人意. 有些人倒是给出了一下答案,但是都不能很好的解决像C/C++一样的 ...
- Python全栈工程师(函数的传参)
ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订 ...
- C# PDF Page操作——设置页面切换按钮 C# 添加、读取Word脚注尾注 C#为什么不能像C/C++一样的支持函数只读传参 web 给大家分享一个好玩的东西,也许你那块就用的到
C# PDF Page操作——设置页面切换按钮 概述 在以下示例中,将介绍在PDF文档页面设置页面切换按钮的方法.示例中将页面切换按钮的添加分为了两种情况,一种是设置按钮跳转到首页.下页.上页或者 ...
- Python之函数(一)定义函数以及传参
定义函数以及传参 函数的定义 def 函数名(): 函数体 例子: def func():#def关键字--定义 func函数名--和变量定义规则一样 ()必须要写格式 :声明 语句结束 s=[1,2 ...
- 『Python × C++』函数传参机制学习以及对比
一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么 ...
- 在Java中动态传参调用Python脚本
最近,又接触到一个奇葩的接口,基于老板不断催促赶时间的情况下,在重写java接口和复用已有的python脚本的两条路中选择了后者,但是其实后者并没有好很多,因为我是一个对python的认识仅限于其名称 ...
随机推荐
- Java之动态代理简介
图截于<大话设计模式> Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 用户可以更 ...
- BZOJ-1568: Blue Mary开公司 (李超线段树)
Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Blue ...
- 3170: [Tjoi 2013]松鼠聚会
题目大意 给定n个点,找到一个点使这个点到其他所有点的切比雪夫距离之和最小. 题解 我们知道切比雪夫距离和曼哈顿距离的转化公式 \(1\)表示切比雪夫距离,\(2\)表示曼哈顿距离 我们有: \(x_ ...
- [HAOI 2011] Problem A
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2298 [算法] 考虑用总人数 - 最多人说真话 显然 , 对于每个人 , 如果他说的 ...
- 【Python】numpy 数组拼接、分割
摘自https://docs.scipy.org 1.The Basics 1.1 numpy 数组基础 NumPy’s array class is called ndarray. ndarray. ...
- uC/OS-II源码分析(五)
每个任务被赋予不同的优先级等级,从0 级到最低优先级OS_LOWEST_PR1O,包括0 和 OS_LOWEST_PR1O 在内.当μC/OS-Ⅱ初始化的时候,最低优先级OS_LOWEST_PR1O ...
- 洛谷 P4336 黑暗前的幻想乡 —— 容斥+矩阵树定理
题目:https://www.luogu.org/problemnew/show/P4336 当作考试题了,然而没想出来,呵呵. 其实不是二分图完美匹配方案数,而是矩阵树定理+容斥... 就是先放上所 ...
- valgrind 代码检查,内存泄漏
使用平台 linux 下载 http://valgrind.org/ 文档 http://valgrind.org/docs/manual/manual.html 博客 https://www.osc ...
- Spring入门第十一课
IOC容器中Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过 ...
- JavaScript 数据访问(通译自High Performance Javascript 第二章) [转]
JavaScript 数据访问(通译自High Performance Javascript 第二章) JavaScript 数据访问(翻译自High Performance Javascript ...