本套课程讲解详细深入,内容丰富,包含了数据结构、JVM、GC等大厂常见的面试知识精讲,而且配有在线的预习文档+课堂笔记+每天作业,可以缩短你的学习周期,提高学习效率。
更多往期视频可以到我哔哩哔哩上观看:码邦主2020年最新的Java视频教程
一:值传递的概念
值传递是在调用方法的时候出现的概念,如果在调用方法的时候传递的参数是原变量的一个副本(拷贝原来的变量而得到),那么这个种参数的传递方式叫做值传递,与值传递对应的是引用传递。当传递的参数是一个引用数据类型(非基本基本数据类型)的时候,此时如果传递的是原变量(此时的元变量是--个对象的地址)的副本(地址的副本)那么依然属于值传递,如果传递的是原变量的真正引用(不需要副本就是同一个)那么这种传递方式就是引用传递。
DEMO:基本数据类型的参数
package com. bai . demo; public class Hello { public static void main(String[] args) { //声明 了变量 int num=10; change(num); System. out . println(num);//输出10还是100 } //该方法改变了你传递的实际参数 public static void change(int temp) { temp*=10; } }
发现了num没有被改变,如果方法的参数类型是基本的数据类型则在专递实际参数的时候本质将原来的numm复制一个副本传递给方法,那么在方法中修改的值就是一个副本,对原来的值没有影响。
下面我们观察如果方法的参数不是基本数据类型的时候呢?
DEMO:引用数据类型的参数传递
package com. bai. demo; public class Hello { public static void main(String[] args) { //声明了变量 Person per=new Person(); per . name="范建"; //调用方法 change(per); System. out . println(per .name);//输出的是范建还是范统? } //该方法改变了你传递的实际参数 public static void change(Person temp) { temp . name="范统"; } }
发现了此时传递到方法之后的对象引用被修改了,而且对原来的对象产生了影响。那是什么原因导致的呢?根据图形作为模型分析。
DEMO:分析过程
经过分析,当执行change(per)的时候会将per 的值赋值给temp,此时temp和per的值是一样的都指向同一块堆内存空间,那么在change方法中修改对象之后对per也有影响。
思考:这种方式是值传递还是引用传递?
其实上还是值传递,因为调用change的时候相当于把per的值复制--份给temp,只不过这个值还是一个引用,就是基于传递的是一个引用所以很多人就将其定义为引用传递。
DEMO:继续观察
package com. bai . demo; public class Hello { public static void main(String[] args) { //声明了变量 String str= "Hello"; change(str); System. out . println(str);// hello or world ? } //该方法改变了你传递的实际参数 public static void change(String temp) { temp="world"; } }
发现了此时输出的是hello,疑问: String 是引用数据类型,引用数据类型在作为实参传递之后在方法中进行修改不都是影响到原来的对象吗?为什么现在不是了?因为String类型的特殊性,通过图形分析String类型特殊在哪儿?
DEMO:分析String类型的的参数传递
上面就分析了String类的特殊性,这个特殊性我们后面会话三节课来进行详细的分析,你先不要着急。
总结:
1、值传递的概念
2、我们认为Java是不存在引用传递
3、字符串的特殊性
4、我们提到了常量池的概念,常量池在就jdk1.7之后移到了堆中,在之前是方法区中(在JVM内存模型课程中去讲解)。
完整的Java初级,高级对应的学习路线和资料!专注于java开发。分享java基础、原理性知识、JavaWeb实战、spring全家桶、设计模式、分布式及面试资料、开源项目,助力开发者成长!
欢迎关注微信公众号:码邦主