【java】的传值方式
【java】的传值方式
当你问大多数程序员Java是传值还是传引用的时候,你可能会得到两种答案之一:
(1)Java传递原始类型数据时使用的是传值方式;传递对象时则使用传引用方式;String类型的数据采用的是传值方式,因为字符串是不可变的。(2)Java传递所有参数都使用传值方式。
只有第二个答案是正确的。理解传值和传引用的区别的关键是要记住,当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。
证明
如果Java通过传引用方式传递对象,那么执行下面的代码就会交换保存在两个变量a和b中的引用,而相应的输出应该如下:
a: 4
b: 100
Swapped!
a: 100
b: 4
其实真正的动作是在方法的参数o1和o2中的引用,它并不影响原始变量a和b。下面是其实际输出:
a: 4
b: 100
Swapped!
a: 4
b: 100
public class SwapTip {public static void main(String []args) {Integer a = new Integer(4);Integer b = new Integer(100);System.out.println("a: " + a);System.out.println("b: " + b);swap(a, b);System.out.println("Swapped!");System.out.println("a: " + a);System.out.println("b: " + b);}public static void swap(Object o1, Object o2) {Object t = o1;o1 = o2;o2 = t;} }
为什么说这个争论的答案是有意义的?
很多参与过争论传递参数的方式的程序员最后都会说:“只是语义不同而已”或者是“没有关系,因为都理解它真正的工作原理。”
对于有经验的程序员来说这可能是一个语义问题,但是对于那么没有什么经验的程序员来说,情况就不一样了。对于程序员来说一个语言的黑拿越少,他们在用那种语言写程序的时候就能做得越好。
一个类比
对象引用与实例的关系就像遥控器与电视机的关系,引用控制对象就像遥控器控制电视机一样。如果一个遥控器的复制品给了另一个人,那么那个人也可以控制电视机。复制的遥控器对电视机的动作(比如说调节音量、改换频道或者调节时钟)对于它本身和原装遥控器来说都是可见的。如果那个人改装了复制的遥控器去控制另外一台电视机,那么原来的遥控器不会受到影响。
诚然,Java是通过传值还是传引用的方式来传递参数只是一个学术上的区别,只要我们知道期望哪种行为即可。但是有时候知道台后的事情也是重要的。
Java只有一种参数传递方式,那就是传值。它简单、有文档可查并且确实是如此。
转自http://www.blogjava.net/zsh118/articles/24564.html
public class Test {public static void main(String[] args) {StringBuffer a = new StringBuffer("A");StringBuffer b = new StringBuffer("B");int i = 5; System.out.println(a + "," + b + "," + i);operate(a, b, i);System.out.println(a + "," + b + "," + i);}public static void operate(StringBuffer x, StringBuffer y, int j) {x.append(y);y = x;y.append("C");j = 1;} }
运行结果:
A,B,5
ABC,B,5
转载于:https://www.cnblogs.com/angelye/p/7478324.html
【java】的传值方式相关推荐
- Java方法 传值方式
这个问题是面试的时候经常会问到的一道题吧?这次做项目的过程中,其中一个同学因为无用了,导致了一个bug,不过是在提测前啦!本来我想借着这次机会分享一下java方法传参的机制,但是经过几天的学习,了解, ...
- java 参数值_Java中的参数传值方式
本文转载自 https://blog.csdn.net/SEU_Calvin/article/details/70089977 1. 你觉得下面程序会输出什么 public static void ...
- java多线程传值覆盖_Java 多线程传值的四种方法
其实大家都知道多线程传值有三种方式: 1:通过构造方法传递数据 2:通过变量和方法传递数据 3:通过回调函数传递数据 那么博主有个非常变态的需求,所以找出了第四种实现方式,先看效果图: 动态Cron4 ...
- java 参数传值的练习题及答案_java方法参数传递面试题三则
传值还是传引用是Java中很基础的一个问题,也是笔试的时候经常被考察的一个问题,总结一下. 题目1: 写出以下程序的输出内容. public class Test { public static vo ...
- Jsp与Servlet之间传值方式
JSP与servlet之间的传值方式 JSP与 servlet之间的传值有两种情况:JSP -> servlet, servlet -> JSP. 通过对象 request和 sessio ...
- java导入包写在第二行的吗_使用Java命令行方式导入第三方jar包来运行Java程序的命令...
1.首先使用命令行进入到a.java所在的文件夹:(比如我的在D:\javaeeworkspace\SharedPS_WS\src\com\dyf\main 这样一个路径下,) d: 回车, cd D ...
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...
- 4)PHP命名规则,传值方式
(1)命名规则: 包括变量名,类名,接口名函数名等等 ①基本规则: 只能使用小写字母,下划线或者数字 数字不能开头 不能跟环境和系统关键字重复(比如,if,else,function) ② 驼峰式 ...
- java非递归方式实现快速排序
Java非递归方式实现快速排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...
- JAVA配置注解方式搭建简单的SpringMVC前后台交互系统
前面两篇文章介绍了 基于XML方式搭建SpringMVC前后台交互系统的方法,博文链接如下: http://www.cnblogs.com/hunterCecil/p/8252060.html htt ...
最新文章
- 当不使用会话状态时禁用它
- signature=dc7ab19a083e9a7f3c43bdcd12a969bb,Alerting system
- leetcode之Insertion Sort List
- A Story of One Country (Hard)(中途相遇法/启发式分裂)
- 不搞虚的!快速把你拉入Docker 的门里
- 【 Logistic Regression 】林轩田机器学习基石
- .net,微软,薪资及其他
- 云科技网络验证源码_黑科技网络验证软件 1.52.0.0免费版
- java自己写的网络爬虫
- uboot之uboot中环境变量
- 不用找,你想要的魏体字体素材都在这里
- 苹果系列手机往电脑上传照片,有什么方法怎么传
- qmh(qtmediahub)插件研究
- 只能上QQ不能上网的解决方法
- Oracle 绑定变量窥视
- 【C++】虚函数与虚函数表
- 谷歌索引量查询,批量查询网站在谷歌RR权重值
- MSRA-TD5000数据集使用
- Android通过反射获取手机是否有NavigationBar方法
- python归一化后全部都是0咋办_python归一化处理
热门文章
- python-os库函数一些用法记录
- MATLAB 求一个矩阵的最大值极其所在位置
- Pytorch和Torchvision版本对应
- db模块未绑定 Uncaught TypeError: Cannot read property 'openDatabase' of undefined
- caffe---验证码识别
- 中文分词项目(开源/API接口)总结
- Day 1: Introduction to Deep Learning
- mysql关于连接查询
- 2021-06-0贪吃蛇练习
- tcp服务端无故死掉了linux,TCP服务端socket会丢连接的诡异问题及思考