本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於java字串和陣列做參數傳遞情況的相關問題,以下就來看一下為什麼說java只有值傳遞,希望對大家有幫助。
推薦學習:《java學習教學》
首先明確的一點就是在java中只有值傳遞!只有值傳遞!理論依據來自《think in java》。接下來就是具體說明為何java只有值傳遞。
因為java中有基本型別和引用型別兩種資料型,再加上String這個特殊的型別,所以主要從三個面向就行解釋。
1. 基本資料型別
先看程式碼
public class Demo01 { public void change(int a) { System.out.println("副本a 的初始值" + a); a = 20; System.out.println("副本a 的新值值" + a); } public static void main(String[] args) { int a = 10; Demo01 d = new Demo01(); d.change(a); System.out.println("change方法执行后的值" + a); } }
分析:
在java中基本資料型別遵循值傳遞,所以物件d在調用change()方法時,只是將原始資料a的副本傳給方法中的參數,第一時間原本和副本a的值都是10,在執行到a=20後,副本a的值變成了20。
所以運行結果為:
原理參考下圖
2. 引用資料類型
先看程式碼
public class Demo02 { char[] ch = {'a', 'b', 'c'}; public void change(char ch[]) { System.out.println("方法中ch[0]的初始值:" + ch[0]); ch[0] = 'g'; System.out.println("方法中ch[0]执行后的新值:" + ch[0]); } public static void main(String[] args) { Demo02 d = new Demo02(); System.out.println("对象d中数组的初始值是:"+d.ch); d.change(d.ch); System.out.println("对象d中数组的最终值是:"+d.ch); } }
分析:
在傳遞類型作為參數傳遞時,也屬於數值傳遞,此時傳遞的是位址值副本,但這兩個地址指向同一個地方。當副本位址沒有進行變更指向時,對副本位址指向的資料進行操作會影響到原始資料的值。方法中ch[] 數組和原始ch[]數組指向同一個數據,所以初始階段ch[0]都指向’a’;接著對副本中的ch[0]進行新的賦值變為‘g’。
所以執行結果為:
原理參考下圖
3. 字串的參數傳遞
先看程式碼
public class Demo03 { public void change(String str2) { System.out.println("方法中str2初始值" + str2); System.out.println("方法中str2初始hashcode值" + str2.hashCode()); str2 = "bbb"; System.out.println("方法中str2赋值后:" + str2); System.out.println("方法中str2赋值后hashcode值:" + str2.hashCode()); } public static void main(String[] args) { String str1 = new String("aaa"); System.out.println("原始字符串str1的hashcode值:" + str1.hashCode()); Demo03 d = new Demo03(); d.change(str1); System.out.println("方法调用后str1的值" + str1); } }
分析:
字串是特殊的資料型,它的底層是一個final 型的char[]陣列,屬於無法更改,所以字串在作為參數傳遞時,可以當做一個特殊的數組進行操作,同樣的它也是將複製一份原本的對象引用給了副本,此時副本對象的引用和原本對象的引用都指向原始字符串的位置,也就是str2在剛開始初始化時它指向的位址和原物件str1指向的位置一致,即str2的初始hashcode值和原始物件str1的hashcode值一樣,str2經過str2=「bbb」操作後,由於字串的不可變性,此時str2會指向一個新的物件引用,即此時str2指向「bbb」的位置。 str2的hashcode值會變化,但原本str1它的物件參考沒有改變,而且「aaa」也沒有改變,所以str1仍然指向」aaa」。 運行結果如下:
接下來看一個更具體的字串範例:
public class Demo04 { public static void main(String[] args) { StringBuffer s = new StringBuffer("hello"); StringBuffer s2 = new StringBuffer("hi"); test(s, s2); System.out.println("方法調用后s的值:" + s); System.out.println("方法調用后s2的值:" + s2); } static void test(StringBuffer s3, StringBuffer s4) { System.out.println("方法初始化時s3的值" + s3); System.out.println("方法初始化時s4的值" + s4); s4 = s3; s3 = new StringBuffer("new"); System.out.println("第一步变化后s3的值" + s3); System.out.println("第一步变化后s4的值" + s4); s3.append("boy"); s4.append("gril"); System.out.println("第二步变化后s3的值" + s3); System.out.println("第二步变化后s4的值" + s4); } }
這次先看結果:
然後進行分析:
在未執行方法之前,字串s1和s2指向的位置分別是“hello”和“hi”,這個毋容置疑,
(1)接著進入方法內部,方法中參數s3和s4初始化時和上面例子相同,此時它們和s1s2指向同一個位置,或者說s1s2將物件引用副本給了s3s4,此時s3s4的值為「hello」和「hi」
(2)接著執行s4=s3,這個操作就是將s3的物件引用給了s4,此時s4為「hello」;s3=new StringBuffer(」new ”);這個操作要注意,此時相當於給了s3一個新的物件引用,s3指向一個字串為“new”的位置,所以此時s3=“new”,s4=“hello”
(3)然後s3.append(“boy”);s4.append(“gril”);在StringBuffer中的append方法要注意,它的操作不會為s3s4指向一個新的物件引用,是在原來的基礎上進行操作,因此操作完之後s3=“newboy”,s4=“hellogril”
(4)此時方法調用完,回頭捋一下s3s4在過程中的對s1s2的影響。
——- A . 首先是s3和s1一樣剛開始指向“hello”,接著給s3創建一個新的對象引用“new”,此時s3和s1再無半毛錢關係,s3進行append( boy)後,s3=“newboy”;
——– B . s4剛開始和s2都指向“hi”,接著s3將自己初始值(也就是s1的副本)給了s4,此時s4指向「hello」(這會s4和s1有了關係),s4執行append(grill)操作,因為它和s1指向相同位置,所以它們的共同指向的物件會變化,s4=s1=「hellogrill」。
——- C .然後就清楚了,s2指向的物件「hi」並未變化,s1指向的「hello」在append(「grill」)操作下變成了「hellogril」。
4. 總結
當使用基本資料型別作為方法的形參時,在方法體中對形參的修改不會影響到實參的數值
當使用引用資料型別作為方法的形參時,若在方法體中修改形參指向的資料內容,會對實參變數的數值產生影響,因為形參變數和實參變數共用同一塊堆區;
當使用引用資料型別作為方法的形參時,若在方法體中改變了形參變數的指向,此時不會對實參變數的數值產生影響,因此形參變數和實參變數分別指向不同的堆區;最後一個例子就是最形象的解釋。
關於字串做參數,也是看它的參數變數指向是否發生了變化,因為String的底層為final類型的char[]原因,當你在String s = “ aaa”還是String s = new String(“aaa”)時,都會為s建立一個新的物件參考。但是呼叫了append()方法時,是不會指向新的對象,會在原來的指向的對像上發生改變,與它共享的對象引用也會改變。
最後重複的是java中沒有引用傳遞,只有值傳遞,引用類型屬於特殊值傳遞(是將它的位址副本給了參數,但是它與基本資料型別不同,如果地址指向的物件發生了變化,因為共享原因,原始物件也會改變)。
推薦學習:《java教學》
以上是一起聊聊JAVA中字串和陣列做參數傳遞的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaachievesPlatFormIndependencethroughTheJavavIrtualMachine(JVM),允許Codetorunondifferentoperatingsystemsswithoutmodification.thejvmcompilesjavacodeintoplatform-interploplatform-interpectentbybyteentbytybyteentbybytecode,whatittheninternterninterpretsandectectececutesoneonthepecificos,atrafficteyos,Afferctinginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginging

JavaispoperfulduetoitsplatFormitiondence,對象與偏見,RichstandardLibrary,PerformanceCapabilities和StrongsecurityFeatures.1)Platform-dimplighandependectionceallowsenceallowsenceallowsenceallowsencationSapplicationStornanyDevicesupportingJava.2)

Java的頂級功能包括:1)面向對象編程,支持多態性,提升代碼的靈活性和可維護性;2)異常處理機制,通過try-catch-finally塊提高代碼的魯棒性;3)垃圾回收,簡化內存管理;4)泛型,增強類型安全性;5)ambda表達式和函數式編程,使代碼更簡潔和表達性強;6)豐富的標準庫,提供優化過的數據結構和算法。

javaisnotirelyplatemententedduetojvmvariationsandnativecodinteinteration,butitlargelyupholdsitsitsworapromise.1)javacompilestobytecoderunbythejvm

thejavavirtualmachine(JVM)IsanabtractComputingmachinecrucialforjavaexecutionasitrunsjavabytecode,使“ writeononce,runanywhere”能力

Javaremainsagoodlanguageduetoitscontinuousevolutionandrobustecosystem.1)Lambdaexpressionsenhancecodereadabilityandenablefunctionalprogramming.2)Streamsallowforefficientdataprocessing,particularlywithlargedatasets.3)ThemodularsystemintroducedinJava9im

Javaisgreatduetoitsplatformindependence,robustOOPsupport,extensivelibraries,andstrongcommunity.1)PlatformindependenceviaJVMallowscodetorunonvariousplatforms.2)OOPfeatureslikeencapsulation,inheritance,andpolymorphismenablemodularandscalablecode.3)Rich

Java的五大特色是多態性、Lambda表達式、StreamsAPI、泛型和異常處理。 1.多態性讓不同類的對象可以作為共同基類的對象使用。 2.Lambda表達式使代碼更簡潔,特別適合處理集合和流。 3.StreamsAPI高效處理大數據集,支持聲明式操作。 4.泛型提供類型安全和重用性,編譯時捕獲類型錯誤。 5.異常處理幫助優雅處理錯誤,編寫可靠軟件。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6
視覺化網頁開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器