【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

规律总结:
Java参数,不管是原始类型还是引用类型,传递的都是副本
   如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.
    如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是通过地址改变改变了地址指向的值,那么在函数内的改变会影响到传入的参数。
    如果在函数中改变了副本的地址,如当执行如a=其他对象,a=new等赋值操作时,实际上是将a指向新的位置,那么函数外的原值不改变。
转自:http://www.cnblogs.com/wangfeixiong/p/7158442.html

转载于:https://www.cnblogs.com/angelye/p/7478324.html

【java】的传值方式相关推荐

  1. Java方法 传值方式

    这个问题是面试的时候经常会问到的一道题吧?这次做项目的过程中,其中一个同学因为无用了,导致了一个bug,不过是在提测前啦!本来我想借着这次机会分享一下java方法传参的机制,但是经过几天的学习,了解, ...

  2. java 参数值_Java中的参数传值方式

    本文转载自 https://blog.csdn.net/SEU_Calvin/article/details/70089977 1.  你觉得下面程序会输出什么 public static void  ...

  3. java多线程传值覆盖_Java 多线程传值的四种方法

    其实大家都知道多线程传值有三种方式: 1:通过构造方法传递数据 2:通过变量和方法传递数据 3:通过回调函数传递数据 那么博主有个非常变态的需求,所以找出了第四种实现方式,先看效果图: 动态Cron4 ...

  4. java 参数传值的练习题及答案_java方法参数传递面试题三则

    传值还是传引用是Java中很基础的一个问题,也是笔试的时候经常被考察的一个问题,总结一下. 题目1: 写出以下程序的输出内容. public class Test { public static vo ...

  5. Jsp与Servlet之间传值方式

    JSP与servlet之间的传值方式 JSP与 servlet之间的传值有两种情况:JSP -> servlet, servlet -> JSP. 通过对象 request和 sessio ...

  6. java导入包写在第二行的吗_使用Java命令行方式导入第三方jar包来运行Java程序的命令...

    1.首先使用命令行进入到a.java所在的文件夹:(比如我的在D:\javaeeworkspace\SharedPS_WS\src\com\dyf\main 这样一个路径下,) d: 回车, cd D ...

  7. iOS 页面间几种传值方式(属性,代理,block,单例,通知)

    第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...

  8. 4)PHP命名规则,传值方式

    (1)命名规则: 包括变量名,类名,接口名函数名等等 ①基本规则: 只能使用小写字母,下划线或者数字 数字不能开头 不能跟环境和系统关键字重复(比如,if,else,function) ② 驼峰式   ...

  9. 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 ...

  10. JAVA配置注解方式搭建简单的SpringMVC前后台交互系统

    前面两篇文章介绍了 基于XML方式搭建SpringMVC前后台交互系统的方法,博文链接如下: http://www.cnblogs.com/hunterCecil/p/8252060.html htt ...

最新文章

  1. 当不使用会话状态时禁用它
  2. signature=dc7ab19a083e9a7f3c43bdcd12a969bb,Alerting system
  3. leetcode之Insertion Sort List
  4. A Story of One Country (Hard)(中途相遇法/启发式分裂)
  5. 不搞虚的!快速把你拉入Docker 的门里
  6. 【 Logistic Regression 】林轩田机器学习基石
  7. .net,微软,薪资及其他
  8. 云科技网络验证源码_黑科技网络验证软件 1.52.0.0免费版
  9. java自己写的网络爬虫
  10. uboot之uboot中环境变量
  11. 不用找,你想要的魏体字体素材都在这里
  12. 苹果系列手机往电脑上传照片,有什么方法怎么传
  13. qmh(qtmediahub)插件研究
  14. 只能上QQ不能上网的解决方法
  15. Oracle 绑定变量窥视
  16. 【C++】虚函数与虚函数表
  17. 谷歌索引量查询,批量查询网站在谷歌RR权重值
  18. MSRA-TD5000数据集使用
  19. Android通过反射获取手机是否有NavigationBar方法
  20. python归一化后全部都是0咋办_python归一化处理

热门文章

  1. python-os库函数一些用法记录
  2. MATLAB 求一个矩阵的最大值极其所在位置
  3. Pytorch和Torchvision版本对应
  4. db模块未绑定 Uncaught TypeError: Cannot read property 'openDatabase' of undefined
  5. caffe---验证码识别
  6. 中文分词项目(开源/API接口)总结
  7. Day 1: Introduction to Deep Learning
  8. mysql关于连接查询
  9. 2021-06-0贪吃蛇练习
  10. tcp服务端无故死掉了linux,TCP服务端socket会丢连接的诡异问题及思考