前言
再讲Java参数传递分析之前先给大家看段代码,想想代码输出结果是啥呀!
public static void main(String[] args) {
String str=" I am Jack";
changeStr(str);
System.out.println("mian方法中值: "+str);
}
public static void changeStr(String str){
str="I am Tom";
System.out.println("changStr方法():"+str);
}
看完之后 大家心中应该有答案了吧!给出答案后!不知道大家想的和实际输出的是否有出入了!大家请看!
看到答案后大家是否有点疑惑,我明明调用changStr()方法了, 为啥在 main方法中 Str 的值还是 “ I am Jack”? 说到这 就开始进入我今天所要讲的主题Java参数分析,先看看Java 基本类型参数分析!
基本类型传递
整数:byte,short, int ,long
浮点型 :float double
逻辑型 :boolean
字符型 :char
这四类八种类型 都是值传递,因为值是直接保存在栈内存中的,所以传递的时候直接拷贝过去了
public static void main(String[] args) {
int num=3;
changeNum(num);
System.out.println("num:"+num);//输出结果3
}
public static void changeNum(int newNum){
newNum=5;
System.out.println("newNum:"+newNum);//输出结果5
}
这些改变都是在changNum()方法中 ,并不影响外面的值 ,这样就可以解释输出结果!
Java 对象传递
这也是我们开发中经常遇到的 理解好对我们开发很有帮助,废话不多说直接上代码
例一
简单实体类
public class Student {
private String name;
private String address;
public Student(String name, String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
Test类
public static void main(String[] args) {
Student stu=new Student("jack","广东广州");
changeStudent(stu);
System.out.println("main() "+stu.getName());
}
public static void changeStudent(Student changeStu){
changeStu.setName("Tom");
System.out.println("changeStudent() "+changeStu.getName());
}
大家思考下 这个输出结果是啥了!如果按照基本类型去思考 你就掉坑了,哈哈哈,给大家看下答案吧!
对改变成功了 两次输出都是Tom 而不是按照基本数据类型传递 看起来现在给大家分析下吧!
可以明确看出stu,changStu 指向同堆空间 意思 在changeStudent()方法中操作也就是同堆空间,这样的话不管是在changeStudent() 输出还是 在这个方法外输出 改变仍然有效。
例二
public static void main(String[] args) {
Student stu=new Student("jack","广东广州");
changeStudent(stu);
System.out.println("main() "+stu.getName());
}
public static void changeStudent(Student changestu){
changestu=new Student("Tom", "广东广州");
System.out.println("changeStudent() "+changestu.getName());
}
这个输出结果大家再想想是啥! 现在我就来公布答案,请看!
是不是又有迷惑了,看下分析图
例三
直接上代码吧!
public static void main(String[] args) {
Student stu=new Student("jack","广东广州");
changeStudent(stu);
System.out.println("main() "+stu.getName());
}
public static void changeStudent(Student changestu){
changestu.setName("scott");
changestu=new Student("Tom", "广东广州");
System.out.println("changeStudent() "+changestu.getName());
}
我想大家通过上面分析输出结果,已经知道了但是 我还是分析呀!加深印象
结果是
分析图
现在回到 开篇说问题,我相信大家都可以很好的解释了 他的输出结果了
因为String对象具有不可变性,所以针对操作str = "I am Tom"
,在String池中不存在的时候,就是相当于str = new String()
,这样变化下的话,那么就和例二具体图一样,所以就不画了,希望对你有帮助.
总结
1,对于基本类型,直接拷贝值传递过去
2,对于对象,拷贝当前对象的引用地址,然后把该地址传递过去,所以也是值传递.
在最后 我想给大家看段代码 ,看看它的输出结果是什么?
public static void main(String[] args) {
String str=null;
str+="I am Jack";
System.out.println("str=== "+str);
}
请在评论中说出你的答案和理由,这是我在项目中的发现一个有趣的东西,想和大家分享下!随便看下和我的理解是否一样 。