1. 关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).
  2. 首先以两个例子开始:
  3. 1)
  4. public class Test2 {
  5. public static void main (String [] args) {
  6. StringBuffer a = new StringBuffer ("A");
  7. StringBuffer b = new StringBuffer ("B");
  8. operate (a,b);
  9. System.out.println(a+","+b);
  10. }
  11. static void operate(StringBuffer x, StringBuffer y){
  12. x.append(y);
  13. y = x;
  14. }
  15. }
  16. 输出:AB,B
  17. 2)
  18. public class Test2 {
  19. public static void add3 (Integer i){
  20. int val=i.intValue();
  21. val += 3;
  22. i = new Integer (val);
  23. }
  24. public static void main (String args [ ] ) {
  25. Integer i = new Integer (0);
  26. add3 (i);
  27. System.out.println (i.intValue ( ));
  28. }
  29. }
  30. 输出:0
  31. 首先我们应该明白JAVA中的参数传递全是以值传递的。是基本类型,就拷贝一个基本类型传进方法;是引用,就拷贝一个引用变量传进去方法,理解了这两点就能理解方法操作对象的相关问题了。最好能画出引用指向对象的图出来,就能完全理解了。
  32. 第1题,调用operate方法时,传入了两个引用a,b的拷贝x,y,这两个x,y都指向原a,b引用所指向的对象。x.append(y)对它指向的 对象(即a指向的对象)进行了操作。而x=y,只是两个拷贝变量在赋值,并没有影响到原b所指向的对象。所以b所指向的对象仍然为B。
  33. 第2题,i=new Integer(val)只是一个引用的拷贝指向了另外一个对象,而原来的i仍然是指向对象new Integer(0)的。
  34. 把握住了JAVA都是传值并且传的都是拷贝的话,类似的题大家都能迎刃而解了。
  35. Java中的参数传递只有一种方式: by value. 理论说教太麻烦了,直接看些例子吧:
  36. 1). 基本类型
  37. public class A{
  38. public static void main(String[] args){
  39. int x = 1;
  40. System.out.println(x);    //1
  41. test(x);
  42. System.out.println(x);    //还是1==>By value
  43. }
  44. static void test(int a){
  45. a = 2;
  46. }
  47. }
  48. 2). 引用类型
  49. public class B{
  50. public static void main(String[] args){
  51. Integer x = new Integer(1);
  52. System.out.println(x);
  53. test(x);
  54. System.out.println(x);
  55. }
  56. static void test(Integer a){
  57. a = new Integer(2);
  58. }
  59. }
  60. 理解这里的关键是区分对象和引用。 这里声明的x是一个引用,而不是一个对象(只是Java把它设计为看上去好像是对象一样)。这个引用它指向了一个对象,这个对象就是后面用new关键字生成的对象。因此,可以说x指向了一个Integer对象。
  61. 在调用test方法的时候,程序将x作为参数传递给test方法了。这里仍然是值传递,在test调用过程中,会产生一份新的引用(不妨叫做y)。此时,x和y指向了同一个对象。
  62. x和y指向的是同一个对象, 由于Java的设计,我们可以通过操作引用来达到操作对象的目的。因此,如果我们此时使用y来修改对象的属性 (例如,y.someField++); 你可以看到x指向的对象同时也被修改到了。
  63. 另一方面,如果我们让y指向另外一个对象, y=new Integer(2); 此时x和y就指向了不同的
  64. 对象。y修改了它指向的对象的属性,很显然不会影响到x指向的对象。
  65. 有人说了数组。数组也是一个引用类型,它的参数传递方式按照引用类型的参数传递一样可以解释得通:
  66. import java.util.Arrays;
  67. public class A{
  68. public static void main(String[] args){
  69. int[] aa = {3, 2, 1};
  70. System.out.println(Arrays.toString(aa)); //[3, 2, 1]
  71. test(aa);
  72. System.out.println(Arrays.toString(aa)); //[3, 2, 1]
  73. test2(aa);
  74. System.out.println(Arrays.toString(aa)); //[4, 2, 1]
  75. }
  76. static void test(int[] a){
  77. a = new int[]{1, 2, 3};   //指向了新对象
  78. }
  79. static void test2(int[] a){
  80. if(a != null && a.length > 0)
  81. a[0]++;              //修改原来的那个对象
  82. }
  83. }
  84. 对象是传引用,简单类型是传值,不要被网上的一些概念所迷惑!!!你可以自己做个试验。
  85. 至于String等类型传的还是引用。如果你用concat方法,String对象的原值就会被改变。
  86. 但你如果按如下方法:
  87. public class Test {
  88. public static void test(String str) {
  89. str = "World";
  90. }
  91. public static void main(String[] args) {
  92. String string = "Hello";
  93. test(string);
  94. System.out.println(string);
  95. }
  96. }
  97.   运行结果:Hello
  98. 这里str = "World" 就等同于 String str=new String("World")。所以结果没有改变!!!
  99. 下列程序在1处是否会有异常,如果没有,输出是什么?是否会运行到2处,如果会,输出是什么?为什么会有这样的结果?
  100.   import java.util.arraylist;
  101. import java.util.list;
  102. public class testclass {
  103. public static void main(string args[]) {
  104. list list = new arraylist();
  105. test2(list);
  106. system.out.println(list.size()); // 1处
  107. test3(list);
  108. system.out.println(list.size()); // 2处
  109. }
  110. public static void test2(list list) {
  111. list = null;
  112. }
  113. public static void test3(list list) {
  114. list.add(“aaaa“);
  115. }
  116. }
  117. plumechen:
  118. 不会出错的。结果是0,1。
  119. 因为test2(list)传得是list的引用,我理解成指针置的副本,list=null;只是把那个传入的值设置为null,不改变原来 list的指针和内容。test3(list)传入的一样,但是执行了list.add()由于传入指针值的副本也指向原来的那个list的地址,所以原 来的那个list的内容就改变了,size变成了1了

转载于:https://blog.51cto.com/lya041/669410

JAVA中参数传递问题的总结(按值传递和引用传递)相关推荐

  1. 如何理解Java中参数传递只能传值?

    以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中 ...

  2. 深入浅出Java中参数传递的原理

    文章目录 前言 基本类型传递 引用类型传递 总结 前言 今天,想和大家聊聊关于java中的参数传递的原理,参数的传递有两种,值传递和引用传递. 值传递:是指在调用函数时将实际参数复制一份传递到函数中, ...

  3. php引用传递_php的按值传递与引用传递 - 小俊学习网

    两者的区别: 值传递是两个变量占用不同的内存空间,而传引用则是同一个内存空间,实际就是对同一个变量进行操作. 传值,原有的值不会消失,不会改变,两个变量分别占用一个内存:传引用,原值会被修改,两个变量 ...

  4. Java基础中按值传递和引用传递详解

    下面是我在网上看到的一个帖子,解释的感觉挺全面,就转过来,以供以后学习参考: 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: [java] view plaincopy ...

  5. Java 中参数传递是传值还是引用?

    2019独角兽企业重金招聘Python工程师标准>>> 明确概念 值传递:指的是将变量的一个备份传过去,当该备份被修改后,不会影响原来变量的值: 引用传递:指的是将该变量的地址传过去 ...

  6. Java里的按值传递与引用传递

    按值传递还是按引用传递 这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论:"在Java里面参数传递都是按值传递".事实上,这很容易让人迷惑,下面先分别 ...

  7. 关于Java中的WeakReference类的笔记(弱引用)

    前言 今天在看ThreadLocal源码的时候,其中内部类ThreadLocalMap中的Entry继承了WeakReferenc,为了能搞清楚ThreadLocal,只能先了解下了WeakRefer ...

  8. java中对象清空值_对象的引用和清除_Java语言程

    对象的引用和清除_Java语言程 4.3.3 对象的引用和清除 在创建了类的对象后,就可以使用对象.即对象使用的原则是"先创建后使用". 使用对象的方法是:通过运算符". ...

  9. Java中被你忽视的四种引用

    正文开始前,有必要先了解下Java内存分配与回收,请见我的相关博文. ---------------------------------- Java的数据类型分为两类:基本数据类型.引用数据类型. 基 ...

最新文章

  1. MIME types [记录]
  2. 智源重大研究方向“智能信息检索与挖掘”发布会(活动报名)
  3. Windows下Appium环境搭建(java版)
  4. Python与风水 的‘’南北通透‘’住宅与‘’南北” 向住宅的均价数据分析
  5. 【知识星球】剪枝量化初完结,蒸馏学习又上线
  6. Unable to start activity ComponentInfo{com.first/com.first.Game}
  7. 设置ComboBox控件的小箭头颜色.
  8. php 获取某一年最后一天_vivo年货节最后一天!多款机型大促,错过让你后悔再等一年!...
  9. 确认过眼神,你是ApacheWay的人 | COSCon‘18 特辑
  10. linux 编译 expat,关于expat库的编译
  11. 利用Maven快速创建一个简单的spring boot 实例
  12. php中计算时间差的几种方法,php计算时间差的方法
  13. 【Java】equals源码分析
  14. Scala学习04——Scala方法与函数
  15. zotero无法同步caj文件 attachments skipped because they are top-level items, file does not exist
  16. 想学编程做程序员,是学前端好还是学后台好?
  17. 计算机老师感言,信息技术教师感言
  18. 基于Scrapy的交互式漫画爬虫
  19. ICE之Slice语言
  20. 图像傅里叶变换后的复数域乘法

热门文章

  1. 初识Notification
  2. VHDL基础 学习笔记
  3. 实现库函数strlen和strcpy
  4. sql server 2005中的服务器角色[转]
  5. Quickr for Portal相关网址
  6. python接口测试第二期_Python接口测试实战2 - 使用Python发送请求
  7. 线上一次fullgc搞得鸡飞狗跳后,我总结了这篇文章
  8. 一文彻底搞懂Cookie、Session、Token到底是什么
  9. 从Eclipse切换到IDEA后需要做的事情
  10. 公众平台小程序文档和工具