摘要:方法結(jié)束后,參數(shù)不再使用了,但是仍然指向那個已經(jīng)被提高了工資的對象??偨Y(jié)中方法參數(shù)的使用情況一個方法不能修改一個基本數(shù)據(jù)類型的參數(shù)。一個方法可以改變一個對象參數(shù)的狀態(tài)。
最近在看《java核心技術(shù)卷1》,看到4.5章節(jié)的時候解決了以前一直有些疑惑的問題。
記錄如下:
首先,在程序設(shè)計語言中,將參數(shù)傳遞給方法(或函數(shù))的術(shù)語有:
按值調(diào)用(call by value)表示方法接收的是調(diào)用者提供的值。
按引用調(diào)用(call by reference)表示方法接收的是調(diào)用者提供的變量地址。
書中還提到了Algol的按名稱調(diào)用。
在java中:
java程序設(shè)計語言總是采用按值調(diào)用。也就是說,方法得到的是所有參數(shù)值的一個拷貝,特別是,方法不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。
例如,考慮代碼:
double percent = 10; harry.raiseSalary(persent);
暫且不用管這段代碼的具體實現(xiàn),書中這個章節(jié)用了雇員類來解釋很多事情,我們現(xiàn)在只要知道這種調(diào)用的方式并不能讓percent的值進行改變就可以了。
以上是一個簡單的例子,說明了java參數(shù)傳遞的方式。下面將從參數(shù)為基本數(shù)據(jù)類型和對象引用兩種情況進行分析:
方法參數(shù)為基本數(shù)據(jù)類型:public static void tripleValue(double x) { x = 3 * x; }
然后調(diào)用:
double percent = 10.0; tripleValue(percent);
調(diào)用之后,percent的值還是10.0,并沒有什么變化。
下面看一下具體的執(zhí)行的過程:
1.x被初始化為percent值的一個拷貝,也還是10。
2.x被乘以了3,然后x變成了30,但是percent仍然是10,因為畢竟是對x的操作,并沒有改變percent。
3.方法結(jié)束之后,x被棄用了,結(jié)果percent還是10。
(Employee為章節(jié)中的一個例子的類,這個類中有raiseSalary方法,這個方法的參數(shù)是提高工資的百分比。構(gòu)造函數(shù)也不是重點所以參數(shù)就用...代替了,不便之處還請諒解)
public static void tripleSalary(Employee x) { x.raiseSalary(200); }
當(dāng)調(diào)用:
harry = new Employee(...); tripleSalary(harry);
具體的執(zhí)行過程為:
1.x被初始化為harry值的拷貝,這里是一個對象的引用。
2.raiseSalary方法應(yīng)用于這個對象的引用,x和harry同時引用的那個Employee對象的薪資提高了200%。
3.方法結(jié)束后,參數(shù)x不再使用了,但是harry仍然指向那個已經(jīng)被提高了200%工資的對象。
所以經(jīng)過以上的例子,有些人可能認(rèn)為java是按引用調(diào)用的,實際上這種理解是不對的。下面舉出一個反例:
編寫一個交換兩個雇員對象的方法:
public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; }
如果是按引用調(diào)用的那么應(yīng)該可以實現(xiàn)對換數(shù)據(jù)的效果:
Employee a = new Employee("Alice"...); Employee b = new Employee("Bob"...); swap(a,b);
但是,并沒有改變存儲在變量a和b中的對象引用,swap方法其實交換的是方法中的xy的引用,也就是a和b的拷貝。對于方法外的ab是沒有影響的。
這個過程說明了java對對象采用的也不是按引用調(diào)用,也是按值調(diào)用的。
總結(jié)java中方法參數(shù)的使用情況:1.一個方法不能修改一個基本數(shù)據(jù)類型的參數(shù)。
2.一個方法可以改變一個對象參數(shù)的狀態(tài)。(比如修改這個對象中的某個屬性值)
3.一個方法不能讓對象參數(shù)引用一個新的對象。(這句話我的理解是不管你在函數(shù)中怎么折騰傳進來的那個對象的引用,函數(shù)結(jié)束了之后對外面都沒什么效果,當(dāng)然了,如果修改了引用對象內(nèi)的屬性,那就屬于情況2的情況了。這句話是對交換的例子的總結(jié))
java是按照傳值調(diào)用的,而不是引用,希望以上的例子和解釋能給新手或者對這部分不太清楚的同學(xué)們些幫助,如果有不恰當(dāng)?shù)牡胤?,還請指教。
謝了!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64462.html
類型推斷 類型推斷是Java編譯器查看每個方法調(diào)用和相應(yīng)聲明的能力,以確定使調(diào)用適用的類型參數(shù),推理算法確定參數(shù)的類型,如果可用,還確定分配或返回結(jié)果的類型,最后,推理算法嘗試查找適用于所有參數(shù)的最具體類型。 為了說明最后一點,在下面的示例中,推斷確定傳遞給pick方法的第二個參數(shù)是Serializable類型: static T pick(T a1, T a2) { return a2; } ...
摘要:本文主要介紹了中的閉包與局部套用功能,由國內(nèi)管理平臺編譯呈現(xiàn)。譬如,認(rèn)為給帶來了閉包特性就是其中之一。但是首先,我們將考慮如何利用閉包進行實現(xiàn)。很顯然,閉包打破了這一準(zhǔn)則。這就是局部調(diào)用,它總是比閉包更為穩(wěn)妥。 【編者按】本文作者為專注于自然語言處理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主講 Java 軟件開發(fā)的書籍,自2008開始供職于 ...
摘要:上一篇小樂帶大家學(xué)過新特性表達式,什么時候可以使用通常表達式是用在函數(shù)式接口上使用的。使用實現(xiàn)創(chuàng)建產(chǎn)生一個工廠對象以上就是小樂帶給大家的新特性之函數(shù)式接口,下一篇將會為大家?guī)硇绿匦灾椒ㄒ?,敬請關(guān)注。 上一篇小樂帶大家學(xué)過 Java8新特性-Lambda表達式,什么時候可以使用Lambda?通常Lambda表達式是用在函數(shù)式接口上使用的。從Java8開始引入了函數(shù)式接口,其說明比較...
每篇一句 胡適:多談些問題,少聊些主義 前言 Spring MVC和MyBatis作為當(dāng)下最為流行的兩個框架,大家平時開發(fā)中都在用。如果你往深了一步去思考,你應(yīng)該會有這樣的疑問: 在使用Spring MVC的時候,你即使不使用注解,只要參數(shù)名和請求參數(shù)的key對應(yīng)上了,就能自動完成數(shù)值的封裝 在使用MyBatis(接口模式)時,接口方法向xml里的SQL語句傳參時,必須(當(dāng)然不是100%的必須,...
摘要:大家好,上一篇小樂給大家講述了樂字節(jié)核心特性表達式,點擊回顧。接下來繼續(xù)核心特性之函數(shù)式接口。感謝大家欣賞小樂帶來的核心特性之函數(shù)式接口,接下來還會更多核心技術(shù)講解,請關(guān)注樂字節(jié)如需要視頻課程,請搜索樂字節(jié)騰訊課堂 大家好,上一篇小樂給大家講述了《樂字節(jié)-Java8核心特性-Lambda表達式》,點擊回顧。接下來繼續(xù):Java8核心特性之函數(shù)式接口。 什么時候可以使用Lambda?通常...
摘要:原文如果覺得我的文章對你有用,請隨意贊賞本文整理運行時獲取方法參數(shù)名的兩種方法,的最新的方法和之前的方法。文件中的調(diào)試信息上文介紹了通過新增的反射運行時獲取方法參數(shù)名。 原文:http://nullwy.me/2017/04/java...如果覺得我的文章對你有用,請隨意贊賞 本文整理 Java 運行時獲取方法參數(shù)名的兩種方法,Java 8 的最新的方法和 Java 8 之前的方法。 ...
閱讀 3811·2021-11-23 09:51
閱讀 1114·2021-11-19 11:30
閱讀 3436·2019-08-29 14:16
閱讀 3427·2019-08-29 12:12
閱讀 2432·2019-08-26 13:40
閱讀 3581·2019-08-26 12:21
閱讀 3128·2019-08-26 11:55
閱讀 2301·2019-08-26 11:35