JAVA修改函式傳入引數值時對原值的影響

2021-06-20 10:47:24 字數 1959 閱讀 4339

在一次瀏覽器請求中,發現後台物件的值變了,但大體瀏覽了下**,沒有對資料做任何更改,再仔細查檢查下,原來是實體做引數被其他物件呼叫時,發生了改動!然後hibernate偵測到了變化,執行了update語句,改變了記錄值。今天在網上搜尋了下,竟然還找到了類似的面試題目,所以自己寫了段**測試下。

下面先上測試的**,後面再做個簡單分析。

public class test 

public void setfirstname(string firstname)

public string getlastname()

public void setlastname(string lastname)

@override

public string tostring()

}/**

* @param args

*/public static void main(string args)

public static void changevalue(int a)

public static void changeref(int a)

public static void changevalue(long a)

public static void changevalue(user u)

public static void changeref(user u)

public static void changevalue(listlist)

public static void changeref(listlist)

}

傳入的引數測試了3種情況:

1.值物件傳遞 2.引用物件 3.集合物件傳遞

第35~43行測試了函式修改傳入值時對外部值的影響。值物件存在函式的呼叫棧中,changevalue和changeref內的 值與外部呼叫的實際上是2個值,不論怎麼改變,都不會影響main函式內a的值。執行輸入如下:

before change value,a1 is :1

after change value,a1 is :1

before change ref,a2 is :1

after change ref,a2 is :1

50~64行測試了在函式內修改引用物件的情況。user物件儲存在堆中,在函式呼叫棧中儲存著對其的引用,changevalue函式利用儲存的引用直接修改了堆中物件的值,所以會影響外部(main)函式中user1的值;但是changeref修改了函式內user2的引用位址,但該修改不會對堆上原有的user2物件產生任何影響。執行結果如下:

before change value,user1 is :user [firstname=jim, lastname=green]

after change value,user1 is :user [firstname=jim, lastname=white]

before change ref,user2 is :user [firstname=lily, lastname=green]

after change ref,user2 is :user [firstname=lily, lastname=green]

集合物件與引用物件的原理一樣。

before change value,list1 is :[zhangsan]

after change value,list1 is :[lisi]

before change ref,list2 is :[zhangsan]

after change ref,list2 is :[zhangsan]

所以在專案中需要使用實體資訊時,為了防止被其他函式改掉,最好還是直接傳實體id或者利用個vo包裝下吧!

獲取無引數js函式實際傳入引數值及引數個數

function a json,prop 如果json可以是json格式物件或函式,prop是json格式的物件 如果json是json格式物件,則將json資料追加為f函式原型的屬性 如果json是函式,則f函式原型繼承json函式的原型,同時將prop中json格式資料追加為f函式原型的屬性 第...

012 將類作為引數傳入函式來修改函式方法

將類作為引數傳入函式來修改 新增 覆蓋 類函式。若將乙個類作為引數傳入乙個函式,並在該函式中為該類新增乙個函式,並且該函式與該類下的某個函式同名,則新新增的函式將覆蓋原類中同名函式。將類 couter1 作為引數傳入 middlefunc 函式 midd.py from test.cinner im...

匿名函式的引數傳入

message hello example function use message echo example 輸出hello message world 輸出hello 因為繼承變數的值的時候是函式定義的時候而不是 函式被呼叫的時候 echo example 想要 在申明 匿名函式之後 使 匿名函...