2019独角兽企业重金招聘Python工程师标准>>>

许多编程语言都有2种方法将参数传递给方法------按值传递和按引用传递。

与其他语言不同,Java不允许程序员选择按值传递还是按引用传递各个参数,基本类型(byte--short--int--long--float--double--boolean--char)的变量总是按值传递。就对象而言,不是将对象本身传递给方法,而是将对象的的引用或者说对象的首地址传递给方法,引用本身是按值传递的-----------也就是说,讲引用的副本传递给方法(副本就是说明对象此时有两个引用了),通过对象的引用,方法可以直接操作该对象(当操作该对象时才能改变该对象,而操作引用时源对象是没有改变的)。

现在说说数组:如果将单个基本类型数组的元素传递给方法,并在方法中对其进行修改,则在被调用方法结束执行时,该元素中存储的并不是修改后的值,因为这种元素是按值传递,如果传递的是数组的引用,则对数组元素的后续修改可以在原始数组中反映出来(因为数组本身就是个对象,int[] a = new int[2];,这里面的int是数组元素的类型,而数组元素的修改是操作对象)。

对于单个非基本类型数组的元素在方法中修改,则在被调用方法结束执行时,该元素中存储的是修改后的值,因为这种元素是按引用传递的,对象的改动将在源数组的数组元素中反映出来。

下面看个小程序:

public class Test{String str = new String("good");char[] ch = {'a','b','c'};int i = 10;public void change(String str,char[] ch,int i){str = "test ok";ch[0] = 'g';i++;    }public static void main(String[] args){Test tt = new Test();tt.change(tt.str,tt.ch,tt.i);System.out.println(tt.i);System.out.print(tt.str+" and ");System.out.println(tt.ch);     }
}

str是String类型的引用,i是基本类型变量,ch是数组名,也是数组对象的引用

在chang()方法里,str="test ok",是一个新的对象把首地址放在引用变量str上;

而ch[0]='g';因为传的是数组的引用,而此时ch[0]='g';是对数组元素的操作,能修改源数组的内容;

i是整型值,只是把值copy了一份给方法,在方法的变化是不改变的源i的。

所以结果是:

10good and gbc

现在咱们把代码变化一下:

public class Test{String str = new String("good");char[] ch = {'a','b','c'};int i = 10;public void change(String str,char ch,int i){str = "test ok";ch = 'g';this.i = i+1;    }public static void main(String[] args){Test tt = new Test();tt.change(tt.str,tt.ch[0],tt.i);System.out.println(tt.i);System.out.print(tt.str+" and ");System.out.println(tt.ch);     }
}

仔细观察下实参以及入参有何变化?

change()方法里的入参char[] ch变成--------------char ch;

这次传递的是个char值的单个数组元素,按照上面的解析,此时ch='9';是不影响源数组元素的。

this.i = i+1;这里面等号左边的i是属性i,等号右边的i是局部变量(入参里的i);

此时i+1后赋值给属性的i,自然会改变属性i的值,同时17行,tt.i又是调用属性的i,这次的结果是:

11good and abc

现在是不是有点明白了?

那好再看下面一个小程序

public class Test{public void change(StringBuffer x,StringBuffer y){x.append(y);y=x;    }public static void main(String[] args){StringBuffer buffA = new StringBuffer("a");StringBuffer buffB = new StringBuffer("b");new Test().change(buffA,buffB);System.out.println(buffA+","+buffB);   }
}

这次传递的是两个对象的引用的值,

在方法change()里 的x.append(y),     其中引用x调用api方法append()修改了new StringBuffer("a");的内容。

y=x;是一个修改内容的对象把首地址赋值给引用变量y了,此时操作的是引用,而先前y是new StringBuffer("b");的引用变量,所以输出结果是:

ab,b

下面是个稍难的小程序,先自己用笔画画过程,写出自己的结果,而后再上机操作下,如果自己的结果和在电脑上的结果一样,那么再碰到这类题就不难了,如果不一样,回头仔细体会下我前面的讲解,找找原因。

public class Test{private String nn = new String("1");private String[] mm = {"2","5"};void test(String nn,String[] mm){nn = new String("3");this.nn = "9";mm[0] = "4";System.out.println("in test(),mm[0]: "+mm[0]);mm = new String[]{"8","7"};System.out.println("in test(),nn: "+nn);System.out.println("this.nn: "+this.nn);System.out.println("mm[0]: "+mm[0]);}public static void main(String[] args){Test s = new Test();s.test(s.nn,s.mm);System.out.println(s.nn+"  "+s.mm[0]);}
}

转载于:https://my.oschina.net/u/2935389/blog/3030265

Java值传递以及引用的传递、数组的传递相关推荐

  1. java 数组传递是引用吗_数组是通过值传递还是通过Java引用传递?

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: Is Java"pass-by-reference"? 数组不是Java中的原始类型,但它们也不是对 ...

  2. Java基础之路--引用数据类型之数组

    什么是数组 数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合. 数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引(下标)从0开始. 数组的定义 第一种 ...

  3. java形参和实参的三种传递方式(值传递,地址传递,引用传递)

    博客 博客 值传递:对形参的修改不会影响到实参 引用传递:对形参的修改会影响实参 一.值传递 在主函数中 #include <iostream> using namespace std;v ...

  4. Java值传递与引用传递

    Java面试题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案基本上是:值传递 说明:得出这种结论的前提必须是&qu ...

  5. Java中传参数--值传递和引用传递

    ** Java中传参数–值传递和引用传递 ** 在Java中,传参数分为值传递和引用传递. 在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数 ...

  6. java的引用传递_Java的值传递和引用传递

    首先来看一段代码: User类: 1 public classUser {2 privateString name;3 4 publicString getName() {5 returnname;6 ...

  7. java中的值传递和引用传递问题

    值传递与引用传递 最近学基础的时候,老师讲了值传递和引用传递,这个问题一直不太明白,上网查了很多资料,按照自己的理解整理了一遍,发现之前不太明白的地方基本上想明白了,如有不正确的地方,欢迎指正,谢谢. ...

  8. 【Java基础】Java中的值传递、引用传递

    Java中的值传递.引用传递 对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己.--<Java编程思想> 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本 ...

  9. Java中值传递和引用传递原理以及区别

    Java在参数传递时有两种:一种是按值传递,一种是按引用传递 值传递:值传递是指在调用方法时将实际参数复制一份传递到方法中,也就是说,在调用方法时,实际参数把他的值的副本传递给对应的形式参数.(注意这 ...

  10. java对象引用出错_“Java有值传递和引用传递”为什么错了?

    前言 初学Java的时候,老师在课堂上说"Java有值传递和引用传递",但网上"Java只有值传递"的呼声很高. 本人在查找资料的过程中,在这两个说法之间反复横 ...

最新文章

  1. 有人从英伟达借了台DGX A100,让神经网络自己造了个GTA5自己玩
  2. 神策数据张涛:企业服务客户全生命周期运营三步曲:执行反馈
  3. 台大林轩田《机器学习基石》系列课程教材的习题更新完毕了
  4. 纯css3天气动画场景特效
  5. POJ 3126 Prime Path(BFS 数字处理)
  6. 如何准备电赛?19年电赛经验总结!
  7. 十一、飞机大战(IVX 快速开发教程)
  8. c语言的44种运算符,C语言重要知识点总结【9】:C语言运算符(详解)
  9. Leetcode每日一题:22.generate-parentheses(括号生成)
  10. jstree禁用父节点点击_Jstree 使用CheckBox插件 选中父节点时被禁用的子节点也会选中问题...
  11. vue pinyin-match下拉框设置拼音模糊搜索
  12. HTML作业制作服装推广软文,盘点:服装推广软文写作技巧
  13. 商鼎云PC端正式亮相—开启内测通告
  14. idea代码放大缩小方式
  15. DAG 图关键路径算法
  16. 与全景图不同,老子云云服务让你动态交互玩模型
  17. HTML CSS 知识点总结
  18. 照片美妆---卷积“换脸”
  19. STM32CubeMx开发之路—LTDC驱动STM32F429I-Discover上的显示屏
  20. Uncaught TypeError: ‘set‘ on proxy: trap returned falsish for property ‘visible‘

热门文章

  1. Unity 创建/实例化对象
  2. 杰理之带卡上电死机【篇】
  3. mysql删除多表sql语句_Mysql删除多表及多表记录sql语句
  4. java log4j 路径配置_log4j配置文件中路径配置一般有三种方法:
  5. Vue入门(五)—— 创建主页,并配置路由
  6. ubuntu 耳机没有声音设置
  7. [历史] 中国文明是世界唯一未曾中断的文明吗?
  8. 常见的语音相关的基本特征
  9. 中投公司望本月成立 7500亿特别国债或市场操作
  10. 痛心!阿里员工在家跳楼去世!