
嘻道奇闻
- 文章199742
- 阅读14625734
Java方法传参原理详解:从内存模型到经典案例
馃 寮€绡囩伒榄傛嫹闂細涓轰粈涔堟柟娉曢噷鏀逛簡瀵硅薄锛屽闈篃璺熺潃鍙橈紵
鍒氬Java閭d細鍎匡紝鎴戠洴鐫€杩欐浠g爜鎬€鐤戜汉鐢燂細
java澶嶅埗public static void main(String[] args) { Person p = new Person("鑰佺帇"); changeName(p); System.out.println(p.name); // 灞呯劧鍙樻垚"鑰佸紶"浜嗭紵锛?/span> } void changeName(Person person) { person.name = "鑰佸紶"; }
涓嶆槸璇碕ava鍙湁鍊间紶閫掑悧锛熸€庝箞瀵硅薄浼犺繘鍘诲氨鑳芥敼锛熶粖澶╁挶浠氨鎺板紑鎻夌浜嗚娓呮杩欎欢浜嬶紝淇濆噯浣犵湅瀹岀洿鎷嶅ぇ鑵匡細"鍘熸潵杩欎箞鍥炰簨锛?
馃 鍐呭瓨妯″瀷璇存槑涔︼紙蹇€掑崟鍙风増锛?/h3>
鎯宠薄浣犵殑Java绋嬪簭鏄釜宸ㄥ瀷蹇€掔珯锛?/p>
- 鈥?strong>鈥嬪熀鏈被鍨嬧€?/strong>鈥嬪氨鍍忕幇閽烇紝鎻e厹閲岀洿鎺ヨ姳 鈫?
int age = 30;
- 鈥?strong>鈥嬪璞$被鍨嬧€?/strong>鈥嬪儚璐甸噸鐗╁搧锛屽緱瀛樹繚闄╃ 鈫?淇濋櫓绠辩紪鍙凤紙鍐呭瓨鍦板潃锛夊啓鍦ㄥ揩閫掑崟锛堝彉閲忥級涓?/li>
涓句釜鏍楀瓙馃尠锛?/p>
java澶嶅埗String s = "hello"; // 鍒涘缓鍖呰9锛屾嬁鍒扮紪鍙?x123 doSomething(s); // 鎶婂啓鐫€0x123鐨勫揩閫掑崟澶嶅嵃涓€浠界粰鏂规硶
杩欐椂鍊欐柟娉曟嬁鍒扮殑鍙槸鈥?strong>鈥嬪鍗颁欢鈥?/strong>鈥嬶紒浣嗗叧閿槸鈥斺€斿鍗颁欢鍜屽師浠跺啓鐫€鍚屼竴涓繚闄╃缂栧彿鍟婏紒鎵€浠ユ柟娉曢噷鏀逛繚闄╃閲岀殑涓滆タ锛屽闈㈠綋鐒惰兘鐪嬪埌鍙樺寲鍟︼紒
馃啔 鍩烘湰绫诲瀷 vs 瀵硅薄绫诲瀷浼犲弬瀵规瘮琛?/h3>
瀵规瘮椤?/th> | 鍩烘湰绫诲瀷 | 瀵硅薄绫诲瀷 |
---|---|---|
浼犻€掑唴瀹?/td> | 鏁板€兼湰韬紙鐜伴噾锛?/td> | 淇濋櫓绠辩紪鍙峰鍗颁欢 |
鍐呭瓨浣嶇疆 | 鏍堝唴瀛?/td> | 鍫嗗唴瀛?/td> |
鏂规硶鍐呬慨鏀?/td> | 鏀圭殑鏄鍗颁欢锛屼笉褰卞搷鍘熷€?/td> | 閫氳繃缂栧彿鏀逛繚闄╃锛屽奖鍝嶅師鍊?/td> |
涓句釜鍙嶅父璇嗘渚嬸煉★細
java澶嶅埗void magic(int num, List
list) { num = 100; // 鏀瑰鍗颁欢锛堟棤鏁堬級 list.add("surprise");// 鏀逛繚闄╃锛堢敓鏁堬級 }
杩欎釜鏂规硶璋冪敤鍚庯紝澶栬竟鐨刬nt鏁板€肩汗涓濅笉鍔紝浣哃ist閲屼細澶氬嚭涓?surprise"锛?/p>
馃挜 涓夊ぇ缁忓吀缈昏溅鐜板満
鍦烘櫙1锛氫互涓轰氦鎹㈡垚鍔熶簡鍏跺疄娌℃崲
java澶嶅埗void swap(String a, String b) { String temp = a; a = b; b = temp; } // 璋冪敤鍚庯細x杩樻槸"鑻规灉"锛寉杩樻槸"棣欒晧"
鈿$湡鐩告椂鍒伙細鏂规硶閲屼氦鎹㈢殑鍙槸澶嶅嵃浠朵笂鐨勭紪鍙凤紝鍘熶欢蹇€掑崟鏍规湰娌″姩锛?/p>
鍦烘櫙2锛氶泦鍚堟竻绌烘儴妗?/h4>
java澶嶅埗void clearList(List data) {
data.clear();
}
// 璋冪敤鍚庯細杈涜嫤鏀堕泦鐨勬暟鎹叏娌′簡锛?/span>
void clearList(List data) {
data.clear();
}
// 璋冪敤鍚庯細杈涜嫤鏀堕泦鐨勬暟鎹叏娌′簡锛?/span>
馃洝锔忛伩鍧戞寚鍗楋細杩欑鎯呭喌搴旇浼?code>Collections.unmodifiableList(data)锛岃鏂规硶鎯虫敼涔熸敼涓嶄簡锛?/p>
鍦烘櫙3锛氭暟缁勭殑杩锋儜琛屼负
java澶嶅埗void changeArray(int[] arr) { arr[0] = 99; // 鉁?鏀逛繚闄╃閲岀殑涓滆タ arr = new int[3]; // 鉂?鏀瑰鍗颁欢涓婄殑缂栧彿 } // 璋冪敤鍚庯細鍘熸暟缁勭涓€涓厓绱犲彉99锛屼絾鏁扮粍杩樻槸鍘熸潵鐨?/span>
杩欓噷鏈変釜鍐风煡璇嗭細鏁扮粍涔熸槸瀵硅薄锛佸彧涓嶈繃闀垮緱鍍忓熀鏈被鍨嬭€屽凡銆?/p>
馃洜锔?闃茬澶寸紪绋嬬绫嶏紙涓汉瀹炴垬蹇冨緱锛?/h3>
-
鈥?strong>鈥嬮槻寰℃€у鍒跺ぇ娉曗€?/strong>鈥嬶細
java澶嶅埗public void updateUser(User user) {
User copy = new User(user.getName()); // 鍏嬮殕涓浛韬?/span>
// 闅忎究鎶樿吘copy瀵硅薄
}
鎴戝湪鐢靛晢椤圭洰閲岀敤杩欐嫑闃蹭綇浜?0%鐨勫弬鏁扮鏀归棶棰橈紝浠g爜review鏃惰缁勯暱澶哥垎鉁?/p>
-
鈥?strong>鈥婼tring鐨勯瓟娉曞厤鐤壒鎬р€?/strong>鈥嬶細
寰堝鏂版墜浼氬洶鎯戜负浠€涔堟敼涓嶄簡String锛?/p>
java澶嶅埗void tryChange(String s) {
s += "!"; // 瀹為檯鍒涘缓浜嗘柊瀵硅薄锛?/span>
}
杩欏氨濂芥瘮鎶婂鍗颁欢涓婄殑缂栧彿鏀规垚浜嗘柊淇濋櫓绠憋紝浣嗗師蹇€掑崟杩樻槸鑰佺紪鍙峰晩锛?/p>
-
鈥?strong>鈥媐inal鍙傛暟鐨勯殰鐪兼硶鈥?/strong>鈥嬶細
java澶嶅埗void test(final List list) {
list.add("鍙互鐨勶紒"); // 鉁?/span>
list = new ArrayList(); // 鉂?缂栬瘧鎶ラ敊
}
final鍙槸閿佹浜嗗鍗颁欢涓婄殑缂栧彿锛屼繚闄╃閲岀殑涓滆タ闅忎究鏀癸紒
馃搳 鐙棬鏁版嵁鏇濆厜
鈥?strong>鈥嬮槻寰℃€у鍒跺ぇ娉曗€?/strong>鈥嬶細
java澶嶅埗public void updateUser(User user) { User copy = new User(user.getName()); // 鍏嬮殕涓浛韬?/span> // 闅忎究鎶樿吘copy瀵硅薄 }
鎴戝湪鐢靛晢椤圭洰閲岀敤杩欐嫑闃蹭綇浜?0%鐨勫弬鏁扮鏀归棶棰橈紝浠g爜review鏃惰缁勯暱澶哥垎鉁?/p>
鈥?strong>鈥婼tring鐨勯瓟娉曞厤鐤壒鎬р€?/strong>鈥嬶細
寰堝鏂版墜浼氬洶鎯戜负浠€涔堟敼涓嶄簡String锛?/p>
java澶嶅埗void tryChange(String s) { s += "!"; // 瀹為檯鍒涘缓浜嗘柊瀵硅薄锛?/span> }
杩欏氨濂芥瘮鎶婂鍗颁欢涓婄殑缂栧彿鏀规垚浜嗘柊淇濋櫓绠憋紝浣嗗師蹇€掑崟杩樻槸鑰佺紪鍙峰晩锛?/p>
鈥?strong>鈥媐inal鍙傛暟鐨勯殰鐪兼硶鈥?/strong>鈥嬶細
java澶嶅埗void test(final List
list) { list.add("鍙互鐨勶紒"); // 鉁?/span> list = new ArrayList(); // 鉂?缂栬瘧鎶ラ敊 }
final鍙槸閿佹浜嗗鍗颁欢涓婄殑缂栧彿锛屼繚闄╃閲岀殑涓滆タ闅忎究鏀癸紒
鍘诲勾甯寮焏ebug鏃剁粺璁¤繃锛屾柊鎵嬫渶甯搁亣鍒扮殑浼犲弬闂Top3锛?/p>
- 浠ヤ负瀵硅薄鍙傛暟鑳介噸鏂拌祴鍊硷紙78%涓嫑锛?/li>
- 璇垽String鍙傛暟鐨勪慨鏀规晥鏋滐紙65%韪╁潙锛?/li>
- 蹇借闆嗗悎鍙傛暟鐨勫壇浣滅敤锛?2%缈昏溅锛?/li>
鏈€缁濈殑鏄湁涓摜浠啓浜嗘寰幆浼犲弬浠g爜锛屾妸List浼犺繘鍘诲垹鍏冪礌锛岀粨鏋滃紩鍙?code>ConcurrentModificationException锛宒ebug浜嗕笁灏忔椂宸偣鎶婇敭鐩樼牳浜?..锛堝埆闂紝闂氨鏄垜骞茶繃绫讳技鐨勪簨馃槄锛?/p>
馃幆 缁堟瀬鐢熷瓨娉曞垯
璁颁綇杩欎釜蹇冭瘈锛?/p>
"浼犲弬灏卞儚瀵勫揩閫掞紝鍘熶欢濮嬬粓鍦ㄦ墜閲岋紝澶嶅嵃浠堕殢浣犳姌鑵撅紝浣嗘敼寰椾簡淇濋櫓绠憋紝鎹笉浜嗗揩閫掑崟锛?
涓嬫鍐嶇湅鍒版柟娉曞弬鏁帮紝鍏堝湪鑴戝瓙閲岀敾涓揩閫掑崟馃摝鈫掍繚闄╃馃敀鐨勭ず鎰忓浘锛屽寘浣犲皯璧板崄骞村集璺紒