1.什么是函數(shù)?
- 定義在類中的具有特定功能的一段獨(dú)立小程序。
- 函數(shù)也叫做方法
2.函數(shù)的格式
- 修飾符 返回值類型 函數(shù)名(參數(shù)類型 形式參數(shù)1, 參數(shù)類型 形式參數(shù)2…) {
執(zhí)行語句(函數(shù)體);
return 返回值;
}
返回值類型:函數(shù)運(yùn)行完成后輸出的數(shù)據(jù)類型。
參數(shù)類型:是形式參數(shù)的數(shù)據(jù)類型。
形式參數(shù):是一個(gè)變量,用于儲(chǔ)存調(diào)用函數(shù)時(shí)傳遞給函數(shù)的實(shí)際參數(shù)。
實(shí)際參數(shù):傳遞給形參的實(shí)際數(shù)據(jù)。
return:結(jié)束函數(shù),返回?cái)?shù)據(jù)給調(diào)用者的關(guān)鍵字。
返回值:該函數(shù)運(yùn)行后的結(jié)果,返回給調(diào)用者。
特殊情況:函數(shù)沒有具體的返回值。
這時(shí)return后直接用分號(hào)結(jié)束。(return在最后一行可以省略)
用void關(guān)鍵字作為返回值類型。
3.函數(shù)的特點(diǎn)
- 定義函數(shù)可以將功能代碼進(jìn)行封裝
- 便于對該功能進(jìn)行復(fù)用
- 函數(shù)只有被調(diào)用才會(huì)執(zhí)行
- 函數(shù)的出現(xiàn)提高了代碼的復(fù)用性
- 對于函數(shù)沒有具體返回值的情況,返回值類型用關(guān)鍵字void表示,那么該函數(shù)中的return語句如果在最后一行,可以省略不寫
- 注意:
- 函數(shù)中只能調(diào)用函數(shù),不能在函數(shù)中定義函數(shù),即函數(shù)不能嵌套調(diào)用
- 定義函數(shù)時(shí),函數(shù)的結(jié)果應(yīng)該返回給調(diào)用者,交由調(diào)用者處理
- 兩個(gè)明確:結(jié)果&參數(shù)
4.重載(overload)
函數(shù)的功能一樣,僅僅參與運(yùn)算的未知內(nèi)容不同時(shí),可以利用重載定義多個(gè)函數(shù),使用同一函數(shù)名,這樣方便閱讀,在調(diào)用時(shí),虛擬機(jī)通過參數(shù)列表的不同來區(qū)分這些函數(shù)。
- 概念:
在同一個(gè)類中,允許存在一個(gè)以上的同名函數(shù),只要它們的參數(shù)個(gè)數(shù)或者參數(shù)類型不同即可。
- 特點(diǎn):
與返回值無關(guān),只看參數(shù)列表
- 好處:
方便與閱讀,優(yōu)化了程序設(shè)計(jì)
- 示例:
public class Utill{ //返回兩個(gè)整數(shù)的和 public static int sum(int a, int b){ return a+b; } //返回兩個(gè)小數(shù)的和 public static double sum(double a, double b){ return a+b; } //返回三個(gè)整數(shù)的和 public static int sum(int a, int b, int c){ return a+b+c; }}
不能這樣定義:因?yàn)樘摂M機(jī)不確定調(diào)用哪個(gè),只能通過參數(shù)列表的類型或個(gè)數(shù)進(jìn)行區(qū)分。
public class Util{ //返回兩個(gè)整數(shù)的和 public static int sum(int a, int b){ return a+b; } //返回兩個(gè)小數(shù)的和 public static double sum(int a, int b){ return a+b; }}
(一)基本數(shù)據(jù)類型:傳值,不會(huì)改變實(shí)參的值
public class Demo{ public static void main(String[] args) { int a = 3,b = 4; fun(a,b); System.out.PRintln(a+","+b); } //試圖交換a和b的值 public static void fun(int a, int b){ int temp = a; a = b; b = temp; } }
運(yùn)行結(jié)果為3,4
分析:當(dāng)程序執(zhí)行到main函數(shù)時(shí),在棧內(nèi)存中就會(huì)多出一個(gè)main方法區(qū),里面有a=3和b=4兩個(gè)變量,接著執(zhí)行fun(a,b),又會(huì)在棧內(nèi)存中創(chuàng)建一個(gè)fun的方法區(qū),里面有a和b變量。接著把main方法的a和b變量賦值給了fun方法區(qū)的a和b變量,即fun方法區(qū)的a=3,b=4,然后在fun方法區(qū)中交換了fun方法區(qū)的a和b的值,即fun方法區(qū)的a=4,b=3,fun方法執(zhí)行完畢了,fun方法區(qū)被釋放。改變不了main方法區(qū)的a和b變量。
(二)對象類型參數(shù):傳引用,函數(shù)體內(nèi)改變形參引用,不會(huì)改變實(shí)參的引用,但是能改變實(shí)參的內(nèi)容。
public class FunDemo{ public static void main(String[] args) { Person p1 = new Person(10); Person p2 = new Person(20); System.out.println("before,p1.age:"+p1.age); System.out.println("before,p2.age:"+p2.age); ss(p1,p2); System.out.println("after,p1.age:"+p1.age); System.out.println("after,p1.age:"+p2.age); }//試圖交換p1和p2的引用,和改變其中一個(gè)的age屬性值 public static void ss(Person p1, Person p2){ Person p = p1; p1 = p2; p2 = p; p1.age = 30; }}
運(yùn)行結(jié)果:
before,p1.age:10
before,p2.age:20
after,p1.age:10
after,p2.age:30
分析:當(dāng)運(yùn)行到Person p1 = new Person(10);時(shí),會(huì)在棧內(nèi)存中開辟一個(gè)新空間來儲(chǔ)存變量p1,在堆內(nèi)存中創(chuàng)建一個(gè)Person(10)的實(shí)例,p2同理。當(dāng)調(diào)用ss方法時(shí),又會(huì)在棧內(nèi)存中開辟新空間來存儲(chǔ)形式變量p1和p2,它們分別指向堆內(nèi)存中對應(yīng)實(shí)際參數(shù)所指向的Person實(shí)例,在ss方法內(nèi)部,交換的是形參的p1和p2的值,即交換了它們的指向。這時(shí)候,實(shí)參的指向并沒有改變。然后,改變形參p1所指向的實(shí)例的內(nèi)容,即改變了實(shí)參p2所指向的實(shí)例的內(nèi)容。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注