java是值调用_Java 只有值调用
在計算機科學中,參數傳遞的形式主要有以下2種: 值調用和引用調用,為了說明Java在傳參過程中的參數傳遞方式,我們首先需要對上述中2種調用形式的定義做清晰的介紹
定義
現給出兩者的定義:值調用(Call by Value): 指函數接收的是調用者提供的實參變量的值
引用調用(Call by reference): 指函數接收的是調用者提供的實參變量的地址
兩種傳遞方式名詞中的“值”和“引用”,是對函數調用時對實參求值策略的分類,而不是指實參的類型。所以,不能依據傳入的實參類型來判斷是何種調用方式。常見的理解錯誤,認為Java中的實參為基本數據類型即值調用,實參為引用類型即為引用調用。實際上,在Java中只有值調用
兩種求值策略區別如下:
值調用: 被調函數的形參得到的是實參變量的值的副本,無法在被調函數中去修改實參的值
引用調用: 被調函數的形參得到的是實參變量本身,故可以通過被調函數中修改實參變量的值
Java 只有值調用
具體到Java中,其函數調用時的參數傳遞,是值調用還是引用調用?我們將分基本類型和引用類型分別討論基本數據類型
對于基本數據類型(byte, short, int, long, float, double, char, boolean)而言(也稱為值類型),形參得到是將實參變量的值的副本,顯然被調函數中對形參的修改無法更新作用于實參,所以,對于實參為基礎類型的情況而言,其參數調用類型為值調用引用類型
對于實參為引用類型時,根據上文可知,我們不能直接根據實參類型來斷定其是引用調用
在Java中引用類型的變量的值,實際上存放的是所指對象的地址,其形參的得到也即該值(實參所指對象的地址)的拷貝,由于此時形參引用和實參引用都是指向同一對象,則在被調函數通過形參的引用變量修改所指對象的數據時,實參的引用同樣可以獲得對所指對象的相應修改。故很多人據此錯誤得出其為引用調用。其實這是錯誤的,因為正如上文所言,形參做的修改之所以能被實參所使用,是因為兩者均指向同一個對象,其傳遞的依然是引用變量的值(即,對象地址),而不是傳遞引用變量的地址。所以如果在被調函數中,修改形參的引用變量的值,即改變形參引用變量其所指向的對象,其結果并不會改變實參的引用變量所指向的對象。
綜上所述,對于實參為引用類型的情況而言,其參數調用類型同樣為值調用,只不過其值是對象的地址
Note不可變對象
不可變對象,即對象一旦被創建后它的狀態(對象的屬性數據)就不能被改變。以下類的實例為不可變的:String, 基本類型的包裝器, BigInteger和BigDecimal等
將不可變對象作為實參傳入方法后,實參并不會被方法中的操作所修改,因為其為不可變對象,在方法中,欲改變該對象的操作實際會生成一個新對象,并讓形參指向該新對象。所以,如前文所述,形參引用變量指向其他對象,并不會影響實參的指向數組
Java中,數組類型為對象。故可按照實參為引用類型進行考慮分析。即,將數組作為形參傳入方法后,在方法中對數組元素的修改,該修改可以體現在原實參數組中。但是如果在方法中,修改形參引用,使其指向其他數組對象,則不會影響原實參數組的內容
總結
以上是生活随笔為你收集整理的java是值调用_Java 只有值调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Objective-C文件流操作
- 下一篇: java nio doug_深入的聊聊