Java中函数参数的值传递与引用传递问题
2015-11-10 14:48
351 查看
首先来看一段代码:
a和b的值并没有像所期待的那样交换,原因是什么?
接下来让我们看看Java中函数参数的值传递和引用传递。。。
归结下来说,函数参数的传递类型都是值传递,对于八大基本类型:byte,char,short,int,long,float,double,boolean传递的是参数的拷贝值,不难理解,这就与元变量脱离了关系。而对于类类型,传递的则是类实例地址值的拷贝,修改参数的值有可能影响原实例的值,接下来看下一组代码:
输出结果为:
1
1
123
张三 10
李四 20
解释:
第一个和第二个输出1,因为int 和 long 都是基本类型,传递给参数 n 的值 分别是Value_n ,Value_m 值的拷贝,这就自然与原变量脱节,不会改变原变量的值
第三个输出“123”,因为String 为类类型,传递给参数str 的值是Value_str 存放在堆中的堆地址值,str = “abc” 等价于 str = new String("abc"),使str 指向存储“abc”的内存地址,这也会造成与原变量彻底脱节,所以并没有改变原变量的值。
第四个输出结果的原理同结果三相同
第五个输出结果为 李四 20,改变了原来的实例值,因为changeStudent1函数中修改了student指向实例的值,即改变了存放在堆内存中Student的实例值,这个实例正是参数student指向的实例,所以这个参数对原实例的值产生了影响
小结:
java函数中参数的传递都是值传递,基本类型传递的是原变量的拷贝值,而类类型传递的则是地址的拷贝值
要判断参数的改变是否会影响到原变量,基本类型传值当然不会影响到原值,对于类类型,就要看改变的是参数的地址还是值,如果改变的是地址,则他们便脱离了关系,如果改变的是值 ,修改的实例就是原引用指向的实例。
import java.util.Scanner; public class Main{ public static void main(String[] args){ int a = 10,b = 20; change(a,b); System.out.println(a+ " " + b); } public static void change(int a,int b){ int t; t = a; a = b; b = t; } }输出结果为:10 20
a和b的值并没有像所期待的那样交换,原因是什么?
接下来让我们看看Java中函数参数的值传递和引用传递。。。
归结下来说,函数参数的传递类型都是值传递,对于八大基本类型:byte,char,short,int,long,float,double,boolean传递的是参数的拷贝值,不难理解,这就与元变量脱离了关系。而对于类类型,传递的则是类实例地址值的拷贝,修改参数的值有可能影响原实例的值,接下来看下一组代码:
import java.util.Scanner; public class Main{ public static void changeInt(int n){ n = 10; } public static void changeLong(long n){ n = 100; } public static void changeString(String str){ str = "abc"; } public static void changeStudent(Student student){ student = new Student("李四",20); } public static void changeStudent1(Student student){ student.setName("李四"); student.setAge(20); } public static void main(String[] args){ int Value_n = 1; long Value_m = 1; changeInt(Value_n); System.out.println(Value_n); changeLong(Value_m); System.out.println(Value_m); String Value_str = new String("123"); changeString(Value_str); System.out.println(Value_str); Student Value_student = new Student("张三",10); changeStudent(Value_student); System.out.println(Value_student); changeStudent1(Value_student); System.out.println(Value_student); } } class Student{ private String name; private int age; Student(String name,int age){ this.name = name; this.age = age; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public String toString(){ return name + " " + age; } }
输出结果为:
1
1
123
张三 10
李四 20
解释:
第一个和第二个输出1,因为int 和 long 都是基本类型,传递给参数 n 的值 分别是Value_n ,Value_m 值的拷贝,这就自然与原变量脱节,不会改变原变量的值
第三个输出“123”,因为String 为类类型,传递给参数str 的值是Value_str 存放在堆中的堆地址值,str = “abc” 等价于 str = new String("abc"),使str 指向存储“abc”的内存地址,这也会造成与原变量彻底脱节,所以并没有改变原变量的值。
第四个输出结果的原理同结果三相同
第五个输出结果为 李四 20,改变了原来的实例值,因为changeStudent1函数中修改了student指向实例的值,即改变了存放在堆内存中Student的实例值,这个实例正是参数student指向的实例,所以这个参数对原实例的值产生了影响
小结:
java函数中参数的传递都是值传递,基本类型传递的是原变量的拷贝值,而类类型传递的则是地址的拷贝值
要判断参数的改变是否会影响到原变量,基本类型传值当然不会影响到原值,对于类类型,就要看改变的是参数的地址还是值,如果改变的是地址,则他们便脱离了关系,如果改变的是值 ,修改的实例就是原引用指向的实例。
相关文章推荐
- 【Java并发编程】:图文讲述同步的另一个重要功能:内存可见性
- 异常类信息查询地址
- 【Java并发编程】:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- java 图片获取宽高
- java implement
- 关于JDK1.7中LinkedList索引方法的思考
- java.sql.Types,数据库字段类型,java数据类型的对应关系
- 【Java并发编程】:生产者—消费者模型(含代码)
- java 实现利用 RabbitMQ 发送和消费消息
- 【Java并发编程】:深入Java内存模型—内存操作规则总结
- java中map集合嵌套形式简单示例
- 读取Java文件到byte数组的三种方式
- Java中如何遍历Map对象的4种方法
- jjava.lang.UnsupportedClassVersionError: main/Main : Unsupported major.minor version 52.0
- 通过SpringMail API发送邮件
- 【Java并发编程】:并发新特性—Executor框架与线程池(含代码)
- Eclipse使用BlueStacks作为android模拟器
- velocity-tools springboot jar 解决 None of the document roots
- java 遍历map 方法 集合 五种的方法
- Spring4整合Quartz2实现定时任务