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