Java 参数传递分析

2017-01-13 15:07:02来源:csdn作者:qq_35101189人点击

第七城市



学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992我们一起学Java!



前言

再讲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);}

看完之后 大家心中应该有答案了吧!给出答案后!不知道大家想的和实际输出的是否有出入了!大家请看!


Paste_Image.png

看到答案后大家是否有点疑惑,我明明调用changStr()方法了, 为啥在 main方法中 Str 的值还是 “ I am Jack”? 说到这 就开始进入我今天所要讲的主题Java参数分析,先看看Java 基本类型参数分析!


基本类型传递

整数:byte,short, int ,long浮点型 :float double逻辑型 :boolean字符型 :char这四类八种类型 都是值传递,因为值是直接保存在栈内存中的,所以传递的时候直接拷贝过去了


public static void main(String[] args) {
intnum=3;
changeNum(num);
System.out.println("num:"+num);//输出结果3 }
public static void changeNum(int newNum){
newNum=5;
System.out.println("newNum:"+newNum);//输出结果5}
Paste_Image.png

这些改变都是在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());}

大家思考下 这个输出结果是啥了!如果按照基本类型去思考 你就掉坑了,哈哈哈,给大家看下答案吧!


Paste_Image.png

对改变成功了 两次输出都是Tom 而不是按照基本数据类型传递 看起来现在给大家分析下吧!


Paste_Image.png

可以明确看出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());}

这个输出结果大家再想想是啥! 现在我就来公布答案,请看!


Paste_Image.png

是不是又有迷惑了,看下分析图


Paste_Image.png例三

直接上代码吧!


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());}
`

我想大家通过上面分析输出结果,已经知道了但是 我还是分析呀!加深印象结果是


Paste_Image.png

分析图


Paste_Image.png

现在回到 开篇说问题,我相信大家都可以很好的解释了 他的输出结果了因为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);
}

请在评论中说出你的答案和理由,这是我在项目中的发现一个有趣的东西,想和大家分享下!随便看下和我的理解是否一样 。














学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992我们一起学Java!



第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台