前言
再講Java參數(shù)傳遞分析之前先給大家看段代碼溢吻,想想代碼輸出結(jié)果是啥呀!
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);
}
看完之后 大家心中應(yīng)該有答案了吧种蝶!給出答案后!不知道大家想的和實(shí)際輸出的是否有出入了瞒大!大家請(qǐng)看螃征!
看到答案后大家是否有點(diǎn)疑惑,我明明調(diào)用changStr()方法了, 為啥在 main方法中 Str 的值還是 “ I am Jack”透敌? 說到這 就開始進(jìn)入我今天所要講的主題Java參數(shù)分析盯滚,先看看Java 基本類型參數(shù)分析!
基本類型傳遞
整數(shù):byte,short, int ,long
浮點(diǎn)型 :float double
邏輯型 :boolean
字符型 :char
這四類八種類型 都是值傳遞酗电,因?yàn)橹凳侵苯颖4嬖跅?nèi)存中的,所以傳遞的時(shí)候直接拷貝過去了
public static void main(String[] args) {
int num=3;
changeNum(num);
System.out.println("num:"+num);//輸出結(jié)果3
}
public static void changeNum(int newNum){
newNum=5;
System.out.println("newNum:"+newNum);//輸出結(jié)果5
}
這些改變都是在changNum()方法中 魄藕,并不影響外面的值 ,這樣就可以解釋輸出結(jié)果顾瞻!
Java 對(duì)象傳遞
這也是我們開發(fā)中經(jīng)常遇到的 理解好對(duì)我們開發(fā)很有幫助泼疑,廢話不多說直接上代碼
例一
簡單實(shí)體類
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());
}
大家思考下 這個(gè)輸出結(jié)果是啥了德绿!如果按照基本類型去思考 你就掉坑了荷荤,哈哈哈,給大家看下答案吧移稳!
對(duì)改變成功了 兩次輸出都是Tom 而不是按照基本數(shù)據(jù)類型傳遞 看起來現(xiàn)在給大家分析下吧蕴纳!
可以明確看出stu,changStu 指向同堆空間 意思 在changeStudent()方法中操作也就是同堆空間,這樣的話不管是在changeStudent() 輸出還是 在這個(gè)方法外輸出 改變?nèi)匀挥行А?/p>
例二
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());
}
這個(gè)輸出結(jié)果大家再想想是啥个粱! 現(xiàn)在我就來公布答案古毛,請(qǐng)看!
是不是又有迷惑了都许,看下分析圖
例三
直接上代碼吧稻薇!
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());
}
我想大家通過上面分析輸出結(jié)果,已經(jīng)知道了但是 我還是分析呀胶征!加深印象
結(jié)果是
分析圖
現(xiàn)在回到 開篇說問題塞椎,我相信大家都可以很好的解釋了 他的輸出結(jié)果了
因?yàn)镾tring對(duì)象具有不可變性,所以針對(duì)操作str = "I am Tom"
,在String池中不存在的時(shí)候,就是相當(dāng)于str = new String()
,這樣變化下的話,那么就和例二具體圖一樣,所以就不畫了,希望對(duì)你有幫助.
總結(jié)
1睛低,對(duì)于基本類型,直接拷貝值傳遞過去
2案狠,對(duì)于對(duì)象,拷貝當(dāng)前對(duì)象的引用地址,然后把該地址傳遞過去,所以也是值傳遞.
在最后 我想給大家看段代碼 ,看看它的輸出結(jié)果是什么钱雷?
public static void main(String[] args) {
String str=null;
str+="I am Jack";
System.out.println("str=== "+str);
}
請(qǐng)?jiān)谠u(píng)論中說出你的答案和理由骂铁,這是我在項(xiàng)目中的發(fā)現(xiàn)一個(gè)有趣的東西,想和大家分享下罩抗!隨便看下和我的理解是否一樣 拉庵。