Java参数传递机制
2015-12-15 12:53
375 查看
Java中的参数传递发生在方法调用中 。
有的时候传递一个基本类型的变量 然后方法中改变参数的值 ,原先的变量并不会被改变。
但是当传递一个非String类型的对象时 ,方法中改变这个传入的对象,原先的对象会被改变。
这些情况,需要分析总结一下 。
先说一下Java 参数传递的两种规则:
1)按值传递; 使用这种方式传参,原先的参数的值不发生改变,因为只是将这个参数的值copy 一份,然后传入方法
2)按址传递; 这种方式是将参数在内存中的存储地址传入到方法中,方法内部通过存储地址改变存储区域的内容,由于参数的存储地址只有一个,在方法内部修改参数的值时,参数原始的值也发生改变。
Java中对这两种规则的使用有明确的要求:
不同的数据类型对应不同的传递规则;
(1) 八种基本类型(int ,char, double等) 和 String 对应 按值传递
为什么有String ,虽然String对象也是按址传递,但是这个对象是不能被改变的,一旦改变就产生新对象,即原有的String引用指向了新的对象
所以也相当是属于按值传递。
例:
(2)
除String以外的所有复合数据类型,包括数组、类和接口 对应 按址传递
因为这些都属于引用类型,创建的对象都对应一个对象引用,传参的时候只是传递一个对象引用,即对象存储位置的指针。
需要注意的是: 在有些按址传递的过程中,不想改变原先对象的值,可以重新构建一个对象 。如:
有的时候传递一个基本类型的变量 然后方法中改变参数的值 ,原先的变量并不会被改变。
但是当传递一个非String类型的对象时 ,方法中改变这个传入的对象,原先的对象会被改变。
这些情况,需要分析总结一下 。
先说一下Java 参数传递的两种规则:
1)按值传递; 使用这种方式传参,原先的参数的值不发生改变,因为只是将这个参数的值copy 一份,然后传入方法
2)按址传递; 这种方式是将参数在内存中的存储地址传入到方法中,方法内部通过存储地址改变存储区域的内容,由于参数的存储地址只有一个,在方法内部修改参数的值时,参数原始的值也发生改变。
Java中对这两种规则的使用有明确的要求:
不同的数据类型对应不同的传递规则;
(1) 八种基本类型(int ,char, double等) 和 String 对应 按值传递
为什么有String ,虽然String对象也是按址传递,但是这个对象是不能被改变的,一旦改变就产生新对象,即原有的String引用指向了新的对象
所以也相当是属于按值传递。
例:
class test { String str = new String("hello"); public void change(String str) { str = "OK"; } public static void main(String[] args){ test t= new test(); t.change(t.str); System.out.print(t.str); } }
// 传递的是成员变量str,但是由于是按值传递,所以最后打印出:hello
(2)
除String以外的所有复合数据类型,包括数组、类和接口 对应 按址传递
因为这些都属于引用类型,创建的对象都对应一个对象引用,传参的时候只是传递一个对象引用,即对象存储位置的指针。
需要注意的是: 在有些按址传递的过程中,不想改变原先对象的值,可以重新构建一个对象 。如:
public class test { public static void main(String[] args) { int[] a = { 1, 2, 3 }; set(a); System.out.println(a[0]); } public static void set(int[] m) { int[] n = new int[m.length]; for (int i = 0; i < m.length; i++) { n[i] = m[i]; } n[0] = 10; } }
相关文章推荐
- java enum(枚举)使用详解+总结
- java Timer
- 深入分析JavaWeb Item19 -- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
- 上struts2的xml在<result type="redirect">参数问题
- java获取客户端的ip地址
- Struts2拦截器执行顺序
- JDK1.5,Switch中使用Enum
- 【JVM系列】Java类型装载、连接与初始化
- Eclipse,MyEclipse相关问题解决方案
- 解决Unable to locate Spring NamespaceHandler for XML schema namespace
- Mac 上查找javahome
- SSH之旅(三)Struts1和Struts2的前世今生
- eclipse 搭建android开发环境
- loadrunner 运行javavuser报错Failed to get JRE version解决方法
- hadoop编译问题(1)java.io.IOExc…
- JavaEE-ORM映射器MyBatis
- 利用eclipse构建spark集成开发环境
- Eclipse将引用了第三方jar包的Java…
- Java中的Set,List,Map的区别
- Java&nbsp;集合转换(数组、List、S…