controller方法名一样参数传递不同如何根据参数匹配_【Java学习 | Javase】方法
整理自:動力節點Javase基礎講義、《Java核心技術》
方法
前言
方法的出現是為了實現代碼的復用,對于功能性代碼,我們希望不要重復寫,而是獨立出來,可以被重復的調用
所以,方法是一段可以完成某個特定功能并且可以被重復利用的代碼片段
方法定義
語法格式:[修飾符列表] 返回值類型 ?方法名(形參列表)[throws 異常列表]{方法體;}
若方法有返回值,則Java語法要求方法必須能夠“百分百保證”在結束時能返回該指定類型
在同一個域中,return語句后面不能寫任何代碼
方法的返回值在接收的時候采用變量的方式接收,要求這個變量的數據類型和返回值類型一致/存在自動轉換
方法調用
對于方法的修飾符列表有static關鍵字的,可以通過“類名.方法名(實參列表)”調用
調用的方法在同一個類中,"類名."可省略
對于方法的修飾符列表沒有static的,通過“實例對象.方法名(實參列表)”調用
實參和形參必須一一對應,即個數要一樣,數據類型要對應相同/存在自動類型轉換
方法調用時的參數傳遞
Java中參數傳遞都是以傳值的方法執行
對于基本數據類型,傳遞時相當于拷貝了一個值傳過去,在方法中對形參的改變不影響實參
對于引用數據類型,傳遞時是把在堆中的對象的內存地址拷貝一份傳遞過去,這種傳遞地址的情況也稱為傳遞了一個引用,由于形參對應對象的內存地址,故對形參的改變會影響到實參(因為把堆中的對象改了),但是這時候仍然是傳值,而不是真的把實參引用傳過去。若在方法中對兩個形參交換不會影響到實參
方法執行過程中內存的變化
方法區中存儲類的信息/代碼片段,方法在執行過程中需要的內存空間在棧中分配
方法只定義不調用的話,只是把它的代碼片段存儲在方法區中,Java虛擬機不會在棧中給該方法分配活動空間
當方法調用時會給該方法在棧內存中分配所屬的活動空間,此時發生壓棧,直到該方法執行結束后,該方法在棧中對應的活動空間就會被釋放,此時發生彈棧
由于棧是先入后出的,故最先調用的方法,最后才結束。采用棧才能保證方法體中的代碼遵循自上而下的順序依次執行,當前行代碼必須執行結束后,下一行代碼才能執行,比如在一個方法中調用另一個方法,必須等到另一個方法執行完畢才能進行下一行
方法重載
引入
對于功能相似的代碼,若分別定義,那么開發人員要記住的方法名大大增加,若使用重載機制,則調用同一個方法名,傳入不同的實參,方法根據不同的參數實現特定的功能,看起來像是在調用同一個方法,這樣開發人員不用記那么多方法,且代碼看起來美觀
定義
方法重載是指在一個類中定義多個同名的方法,但要求每個方法有不同的參數的類型或參數的個數
用的時機
多個功能相似時
滿足條件
在同一個類
方法名相同
參數列表不同
代碼檢驗
調用同一個類的靜態方法,可省略"類名.",但對于不同的類,不能省略
????public?static?void?main(String[]?args)?{
????????print();
????????/*找不到符號*/
????????sayHello();
????}
????public?static?void?print(){}
}
public?class?Sub?{
????public?static?void?sayHello(){}
}
在同一個域中,return后面不能有語句
????public?static?void?main(String[]?args)?{
????}
????public?static?int?max(int?a,int?b){
????????if(a?>?b){
????????????return?a;
????????????/*Unreachable?statement*/
????????????System.out.println("hello");
????????}
????????return?b;
????}
}
方法體中代碼嚴格按照自上而下的順序,因為方法調用時會入棧,方法結束時出棧,而棧是先入后出的
main?method?start...
m1?method?start...
m2?method?start...
m2?method?over....
m1?method?over....
main?method?over....
public?class?Test?{
????public?static?void?main(String[]?args)?{
????????System.out.println("main?method?start...");
????????m1();
????????System.out.println("main?method?over....");
????}
????public?static?void?m1(){
????????System.out.println("m1?method?start...");
????????m2();
????????System.out.println("m1?method?over....");
????}
????public?static?void?m2(){
????????System.out.println("m2?method?start...");
????????System.out.println("m2?method?over....");
????}
}
方法重載與修飾符列表及返回值類型沒有關系
????public?static?void?main(String[]?args)?{??}
????public?static?void?doSome(int?i){?}
????/*Error:已在類中定義了方法?doSome(int)*/
????public?static?int?doSome(int?i){return?1;}
????public?void?doSome(){?}
????/*Error:已在類中定義了方法?doSome()*/
????public?static?void?doSome(){?}
????/*Error:已在類中定義了方法?doSome()*/
????protected?static?void?doSome(){?}
}
即使是引用類型作為實參也是值傳遞,可通過在方法中交換兩個引用類型而實參沒有交換驗證
????int?v;
????public?Sub(int?v)?{
????????this.v?=?v;
????}
????public?static?void?main(String[]?args)?{
????????Sub?s1?=?new?Sub(1);
????????Sub?s2?=?new?Sub(2);
????????System.out.println(s1.v);//1
????????System.out.println(s2.v);//2
????????swap(s1,s2);
????????System.out.println(s1.v);//1
????????System.out.println(s2.v);//2
????}
????public?static?void?swap(Sub?s1,Sub?s2){
????????Sub?temp?=?s1;
????????s1?=?s2;
????????s2?=?temp;
????}
}
總結
以上是生活随笔為你收集整理的controller方法名一样参数传递不同如何根据参数匹配_【Java学习 | Javase】方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辽宁直招军官什么时候入伍
- 下一篇: 子弹打不穿战车装甲?