Java中的方法

方法概述

所謂方法七咧,就是用來解決一類問題的代碼的有序組合,是一個功能模塊
作用:封裝重復(fù)邏輯叮叹,邏輯更清晰
語法格式:

訪問修飾符 返回類型 方法名(參數(shù)列表){
  方法體
}

訪問修飾符:允許被訪問的權(quán)限范圍艾栋,可以是public/private/default/protected
返回類型:可以是void(無返回值) 以及任何數(shù)據(jù)類型,帶返回值方法使用return語句進行返回蛉顽。
參數(shù)列表:傳遞給方法的參數(shù)列表蝗砾,可省略,參數(shù)可以有多個携冤,以逗號分隔悼粮,每個參數(shù)由參數(shù)類型及參數(shù)名組成。
根據(jù)方法是否帶參數(shù)曾棕、是否帶返回值扣猫,可分為四類:
? 無參無返回值方法
? 無參帶返回值方法
? 帶參無返回值方法
? 帶參帶返回值方法

無參無返回值方法

如果方法不包含參數(shù),且沒有返回值翘地,我們稱為無參無返回值的方法申尤。
該方法的返回類型為void,且方法中不能使用return返回值衙耕!(可以單獨使用return;)

public class HelloMethod {
    //定義方法
    public void show(){
        //方法體
        System.out.println("welcome to learn java");
    }
    public static void main(String[] args) {
        //創(chuàng)建一個HelloMethod類的對象hello
        HelloMethod hello = new HelloMethod();
        //使用對象名.方法名()去調(diào)用方法
        hello.show();
    }
}

無參帶返回值方法

如果方法不包含參數(shù)昧穿,但有返回值,我們稱為無參帶返回值的方法臭杰。
返回使用return語句粤咪,返回的數(shù)據(jù)類型要與方法聲明的返回類型相匹配(兼容)。

public class HelloMethod { 
    //定義求長方形面積的方法
    public int getArea(){
        int length = 10, width = 5;
        return length * width; //返回語句
    }
    public static void main(String[] args) {
        HelloMethod hello = new HelloMethod();
        //打印返回值渴杆,或者可以定義變量接收返回值:int area = hello.getArea();
        System.out.println("長方形的面積為:" + hello.getArea());
    }
}

帶參無返回值方法

可以通過在方法中加入?yún)?shù)列表接收外部傳入的數(shù)據(jù)信息寥枝,來完成特定的功能實現(xiàn)。
參數(shù)可以是任意的基本類型數(shù)據(jù)或引用類型數(shù)據(jù)磁奖,調(diào)用帶參方法時囊拜,必須保證實參的數(shù)量、類型比搭、順序與形參一一對應(yīng)冠跷。
形參:我們把定義方法時的參數(shù)稱為形參,目的是用來定義方法需要傳入的參數(shù)的個數(shù)和類型
實參:把調(diào)用方法時的參數(shù)稱為實參身诺,是傳遞給方法真正被處理的值
實參可以傳遞變量或者字面值蜜托,當傳遞變量時變量名不需要與形參名相同

public class HelloMethod {
    //輸出兩個數(shù)的最大值
    public void max(float a, float b){
        float max = a > b ? a : b;
        System.out.println("兩個數(shù)" + a + "和" + b + "的最大值為:" + max);
    }
    public static void main(String[] args) {
        HelloMethod hello = new HelloMethod();
        int a = 3, b = 5;
        hello.max(a, b); //可以傳遞int值,因為可以自動轉(zhuǎn)換為float型
        float m = 5.6f, n = 3.4f;
        //傳遞實參名
        hello.max(m, n);
        //傳遞字面值
        hello.max(6.6f, 3.3f);
        //hello.max(1.2, 3.4); 錯誤霉赡,不能傳遞double類型
    }
}

帶參帶返回值方法

如果方法既包含參數(shù)橄务,又帶有返回值,我們稱為帶參帶返回值的方法穴亏。

public class HelloMethod {
    //求階乘的方法
    public int factorial(int num){
        int s = 1;
        for (int i = 1; i <= num; i++) {
            s *= i;
        }
        return s;
    }
    public static void main(String[] args) {
        HelloMethod hello = new HelloMethod();
        int fac = hello.factorial(5);
        System.out.println("5! = " + fac); //120
        int sum = 0;
        //求1! + 2! + 3! + 4! + 5!
        for (int i = 1; i <= 5; i++) {
            fac = hello.factorial(i);
            sum += fac;
        }
        System.out.println("1!+2!+3!+4!+5!=" + sum); //153
    }
}

方法重載

如果同一個類中包含了兩個或兩個以上方法名相同蜂挪、方法參數(shù)的個數(shù)重挑、順序或類型不同的方法,則稱為方法的重載棠涮。
特點:同一個類中谬哀,方法名相同,參數(shù)列表不同(參數(shù)類型或者參數(shù)個數(shù)或者參數(shù)順序)严肪,與方法修飾符和返回值無關(guān)
好處:對于具有相同功能的方法可以重用方法名史煎,使其更符合語義

    //求兩個int類型數(shù)的和(重載方法)
    public int plus(int m, int n){
        return m + n;
    }
    //求兩個double類型數(shù)的和(重載方法)
    public double plus(double m, double n){
        return m + n;
    }
    //求數(shù)組元素的累加和(重載方法)
    public int plus(int[] arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
    
    public static void main(String[] args) {
        HelloMethod hello = new HelloMethod();
        int a = 5, b = 10;
        int[] arr = {1,2,3,4,5};
        //當調(diào)用被重載的方法時, Java會根據(jù)參數(shù)的個數(shù)和類型來判斷應(yīng)該調(diào)用哪個重載方法诬垂,參數(shù)完全匹配的方法將被執(zhí)行
        System.out.println("int類型的和為:" + hello.plus(a, b));
        System.out.println("double類型的和為:" + hello.plus(5.6, 3.4));
        System.out.println("數(shù)組元素的和為:" + hello.plus(arr));
    }

方法傳值問題

基本數(shù)據(jù)類型的參數(shù)傳遞

基本數(shù)據(jù)類型的參數(shù)傳遞屬于值傳遞劲室,即方法調(diào)用時,實際參數(shù)把它的值傳遞給對應(yīng)的形式參數(shù)结窘,函數(shù)接收的是原始值的一個copy很洋,在方法的內(nèi)部改變參數(shù)的值并不會影響傳遞進來的外部對象。

public class HelloMethod {
    //基本數(shù)據(jù)類型的參數(shù)傳遞
    public void add(int n){
        n++;
        System.out.println("方法中n=" + n);
    }

    public static void main(String[] args) {
        int n = 10;
        HelloMethod hello = new HelloMethod();
        hello.add(n); 
        System.out.println("方法調(diào)用后n的值:" + n);
        //方法中n=11
        //方法調(diào)用后n的值:10
    }
}
引用類型的參數(shù)傳遞

引用類型的參數(shù)傳遞屬于引用傳遞隧枫,方法調(diào)用時喉磁,實際參數(shù)的引用(地址)被傳遞給方法中相對應(yīng)的形式參數(shù),函數(shù)接收的是原始值的內(nèi)存地址官脓,此時方法參數(shù)和實參指向了同一個內(nèi)存空間协怒。
a) 如果在函數(shù)中沒有改變這個引用地址,而是改變了地址中的內(nèi)容卑笨,那么在函數(shù)內(nèi)的改變就會影響到傳入的實際參數(shù)孕暇。
b) 如果在函數(shù)中改變了引用地址,比如重新new一個赤兴,那么形參就指向了一個新的地址妖滔,此時傳入的參數(shù)還是指向原來的地址,所以函數(shù)內(nèi)的改變不會影響到傳入的實際參數(shù)桶良。

public class HelloMethod {
    //引用類型的參數(shù)傳遞
    public void updateArray(int[] a){
        a[3] = 15;
    }
    //引用類型的參數(shù)傳遞
    public void updateArray2(int[] a){
        a = new int[a.length]; //a重新指向了新的內(nèi)存空間(地址)
        a[3] = 20;
    }
    public static void main(String[] args) {
        HelloMethod hello = new HelloMethod();
        int[] a1 = {1,2,3,4,5}, a2 = {1,2,3,4,5};
        hello.updateArray(a1);
        System.out.println("方法調(diào)用后數(shù)組元素為:");
        for (int n : a1) {
            System.out.print(n + " ");
        }
        System.out.println();
        //方法調(diào)用后數(shù)組元素為:
        //1 2 3 15 5
        hello.updateArray2(a2);
        System.out.println("方法調(diào)用后數(shù)組元素為:");
        for (int n : a2) {
            System.out.print(n + " ");
        }
        System.out.println();
        //方法調(diào)用后數(shù)組元素為:
        //1 2 3 4 5 
    }
}

特別注意包裝類以及String類(后續(xù)介紹)的不可變性座舍,也就是說對它們的值的改變實際上都是創(chuàng)建新的對象。

    public void append(String str){
        str += " hehe"; //str指向了新的字符串對象
    }
    public static void main(String[] args) {
        HelloMethod hello = new HelloMethod();
        String str = "hello";
        hello.append(str);
        System.out.println(str); //hello
    }

可變參數(shù)列表

  • 參數(shù)數(shù)量不確定陨帆,可以隨時變化曲秉,可變參數(shù)的本質(zhì)是一個數(shù)組,會將傳入的多個參數(shù)轉(zhuǎn)成一個數(shù)組疲牵,而參數(shù)名就是數(shù)組引用承二,所以可以使用索引訪問參數(shù)列表。
  • 可變參數(shù)與數(shù)組類型不能重載纲爸,因為二者本質(zhì)上是一樣的亥鸠。
  • 方法如果有多個參數(shù)時,可變參數(shù)必須放在最后缩焦。
  • 可以將數(shù)組傳遞給可變參數(shù)列表读虏,但是數(shù)組作為參數(shù)時,是不能將多個值傳遞給數(shù)組的袁滥!
  • 可變參數(shù)列表所在的方法是最后被訪問的盖桥,如果有其他匹配的方法,會優(yōu)先執(zhí)行题翻。
public class HelloMethod {
    //可變參數(shù)
    public int plus(int... a){
        System.out.println("帶可變參數(shù)的方法被調(diào)用");
        int sum = 0;
        for(int n : a){
            sum += n;
        }
        return sum;
    }
    //重載方法
    public int plus(int a, int b){
        System.out.println("不帶可變參數(shù)的方法被調(diào)用");
        return a + b;
    }
    //多個參數(shù)揩徊,可變參數(shù)放在最后
    public int search(int a, int... arr){
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == a){
                return i;
            }
        }
        return -1;
    }
    public static void main(String[] args) {
        HelloMethod hello = new HelloMethod();
        //優(yōu)先匹配不帶可變參數(shù)方法
        hello.plus(1, 2);
        //傳遞數(shù)組
        int[] a = {1,2,3,4,5,6};
        hello.plus(a);
        //可變參數(shù)方法調(diào)用
        System.out.println("和為:" + hello.plus(1,2,3,4,5,6));
        /*不帶可變參數(shù)的方法被調(diào)用
          帶可變參數(shù)的方法被調(diào)用
          帶可變參數(shù)的方法被調(diào)用
          和為:21
         */
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嵌赠,隨后出現(xiàn)的幾起案子塑荒,更是在濱河造成了極大的恐慌,老刑警劉巖姜挺,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齿税,死亡現(xiàn)場離奇詭異,居然都是意外死亡炊豪,警方通過查閱死者的電腦和手機凌箕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來词渤,“玉大人牵舱,你說我怎么就攤上這事∪迸埃” “怎么了芜壁?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長高氮。 經(jīng)常有香客問我慧妄,道長,這世上最難降的妖魔是什么纫溃? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任腰涧,我火速辦了婚禮,結(jié)果婚禮上紊浩,老公的妹妹穿的比我還像新娘窖铡。我一直安慰自己,他們只是感情好坊谁,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布费彼。 她就那樣靜靜地躺著,像睡著了一般口芍。 火紅的嫁衣襯著肌膚如雪箍铲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天鬓椭,我揣著相機與錄音颠猴,去河邊找鬼关划。 笑死,一個胖子當著我的面吹牛翘瓮,可吹牛的內(nèi)容都是我干的贮折。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼资盅,長吁一口氣:“原來是場噩夢啊……” “哼调榄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呵扛,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤每庆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后今穿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缤灵,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年蓝晒,在試婚紗的時候發(fā)現(xiàn)自己被綠了凤价。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拔创,死狀恐怖利诺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剩燥,我是刑警寧澤慢逾,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站灭红,受9級特大地震影響侣滩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜变擒,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一君珠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娇斑,春花似錦策添、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苦丁,卻和暖如春浸颓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工产上, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棵磷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓晋涣,卻偏偏與公主長得像泽本,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姻僧,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 穿越宇宙的時間簡史 ----------紀念杰出的科學(xué)家斯蒂芬·霍金 羅金海/文 站在宇宙的星空輕輕的呼喚您的名...
    詩人梅梅閱讀 369評論 0 1
  • “讀書”這個詞似乎離我們的生活漸行漸遠了,現(xiàn)在我們社會已經(jīng)進入了一個大數(shù)據(jù)時代蒲牧,很多人喜歡選擇電子化設(shè)備來...
    青顏惠閱讀 368評論 0 4
  • 我的故鄉(xiāng)里有個宮廟冰抢,叫興福宮松嘶。里面供奉了四尊神像,因為在農(nóng)村里挎扰,沒人會去分別道教跟佛教翠订。所有的神祇都被村里人籠統(tǒng)地...
    天水訟閱讀 2,151評論 0 3
  • 從平尘〕看街拍就知道今年的流行元素多到爆炸,特別是大家都喜歡在襯衫上動心思梧躺,各種顏色的襯衫更是俘獲一大波明星潮人的心...
    潮流一起說閱讀 272評論 0 0