这里有新鲜出炉的 Java 函数式编程,程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称.
下面小编就为大家带来一篇浅谈 Java 中方法参数传递的问题.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧
可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递.在这里,定义方法时,参数列表中的变量,我们称为形式参数.
调用方法时,传入给方法的数值,我们称为实际参数
在 Java 中调用方法时,如果参数是基本类型(byte/short/int/long/float/double/char/boolean) 以及 String 类型时,形式参数的改变不影响实际参数.
以下代码在内存中发生的动作:
最开始时,方法区中存入 main()方法文件,然后在栈中 main()方法入栈(压栈),局部变量入栈初始化,执行到 change()方法,方法区中有 change()文件,接着 change()入栈,实参 a/b 将自己的值赋值给形参 a/b,执行方法中的代码,形参 a 变为 20,形参 b 变为 40,执行完后,change()方法立刻出栈(弹栈),形参 a/b 也从内存中消除.期间并没有影响到实参的值.
如果是引用数据类型(不包括 String),比如数组 int[ ],形参的改变会影响到实参.
最开始时,方法区中存入 main()方法文件,然后在栈中 main()方法入栈(压栈),创建用静态方法创建数组,相当于 new 了一个 int[],凡是 new 出来的都要进入堆中,在堆中划出一块内存空间,分成 5 份用来存储 5 个元素,先初始化元素的值全为 0,然后将每个变量赋值 1,2,3,4,5,然后将开辟的这块内存地址 0x1234 赋给 arr.执行到 change()方法,方法区中有 change()文件,接着 change()入栈,实参 arr 将地址值赋值给形参 arr,实参和形参都指向堆中开辟的内存,然后在 change()中,将数组中的偶数元素变为 2 倍,改变的就是堆内存中的数据.然后 change()方法执行完后出栈,主方法中打印数组,实参 arr 仍指向对内存中的已经改变的数组,并输出.形参的改变影响到实参的数值.
对于 String 类型比较特殊,它本身是引用数据类型,但是在这里按基本数据处理.因为字符串的本质是字符数组, 在方法区中有专门一块地方叫字符串常量池用来存储字符串常量. 这里记住: 凡是用双引号引起来的都是字符串常量, 存储在字符串常量池当中. 如图中的 "hello" 字符串存储在字符串常量池中, 地址值为 0x666, 然后 Stirng str1 = new String("hello"), 在堆中开辟一块内存, 将 "hello" 的地址值 0x666 存储在内存中, 同时将该内存的地址值 0x999 赋给 str1. 然后 String str2 = "hello", 将 "hello" 的地址值 0x666 直接赋给 str2.
String 有一个特点, 每改变一次就会在字符串常量池中生成一个新的常量, 比如 String s = "hello" 在字符串常量池中的地址是 0x666, 然后 s = "hello"+1, 此时的字符串常量池会开辟一块新的空间给 "hello1", 地址值为 0x333, 再将地址值赋值给 s. 所以, String s = "hello", 将 s 作为实参传递给方法时, 无论形参中的 s 怎么改变都不会影响到 0x666 的 "hello", 也不会影响到实参 s. 所以 String 虽然作为引用数据类型, 但它形参的变化不会影响到实参.
以上这篇浅谈 Java 中方法参数传递的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 PHPERZ.
来源: http://www.phperz.com/article/18/0120/354675.html