如果后續我們寫的代碼越來越多,全部都放在main方法中的話,可讀性會很不好,有一些代碼也要重重復復的寫,造成代碼量很大...
所以我們可以將一些代碼抽取出來,放在自定義的方法中,在main方法中直接或間接的調用它們。
1.什么是方法?
方法是具有一定功能的代碼片段。
2.如何定義一個方法?
我們首先先看看我們最熟悉的main方法:
public static void main(String[] args) {
}
我們逐個來分析:
權限修飾符
public意為公有的,是一個權限修飾符。除此之外,我們還有另外三種權限修飾符:protected受保護的、private私有的、default(不寫權限修飾符的話默認為default)。權限修飾符顧名思義就是訪問的權限,不同的修飾符,訪問的權限是不一樣的。
權限修飾符用於修飾成員變量、方法、類、接口。(后續會學到這些概念)
(注意:方法中的局部變量只能使用默認的default,不能使用另外三個權限修飾符修飾)
在這里涉及到子類的概念,可暫時不管,因為我們目前只寫一個類,所以看看本類就好。
本類 | 同一個包下(子類和無關類) | 不同包下(子類) | 不同包下(無關類) | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
可以看到只要在同一個類中,被任何修飾符修飾的方法都是可以被調用的。(最后代碼驗證)
狀態修飾符static
static是靜態的意思。在這里先了解:被static修飾的變量為靜態變量,被static修飾的方法稱為靜態方法。靜態變量和靜態方法都屬於類,在靜態方法中只能直接調用靜態方法。(后續對象內容的時候會更加詳細的介紹static)
返回值
void是返回值為空的意思,即沒有要返回的數據,除了void,方法的返回值可以是基本數據類型、引用數據類型(數組、字符串、其它類、集合...)。
如何返回數據呢?
return + 對應返回值類型的要返回的數據;
void返回值為空,省略了return;
注意點:
定義了返回值則必須返回數據,且必須返回與返回值類型一樣的數據類型的數據,否則會報錯提示;
一個方法中可以有多個return語句;當碰到其中一個return語句時,就會結束該方法。(最后的代碼中有驗證)
方法名
main是方法名,如果是我們自定義的方法,就需要我們自定義的名字,但是起名最好能夠見名知意,並且要符合標識符規則,方法取名一般為小駝峰命名(第一個單詞首字母小寫,其余單詞首字母大寫),如helloWorld、printString...
參數
String []args我們已經知道是什么了,即一個String類型的參數,在這里args是形式參數,目前是沒有具體的值的。我們也可以定義自參數,參數的類型可以為基本數據類型,也可以為引用數據類型,可任意個個數,但是在調用方法的時候,必須按照參數的順序將對應的參數傳給方法。
以上我們已經分析了一個方法的框架,但是權限修飾符、狀態修飾符、參數都不是一個方法必須有的,即都是可選的。
方法定義模板:
[權限修飾符][其它修飾符] 返回值 方法名([參數...]){
方法體(具有一定功能的代碼片段)
}
在此擴展方法的可變參數:
如果我們不確定參數的個數為多少個,必須在使用的時候才知道的話,這個時候我們就可以使用可變參數:
語法:
數據類型...變量名
!必須放在最后,且只能定義一次。(本質是一樣的,因為只能放在最后,所以1個以上肯定有的不是在最后)
3.方法的使用
當我們了解完上述定義方法后,就可以嘗試着定義使用方法了!
package com.dh.method;
public class Method02 {
//1.
//公有的 靜態的 返回值類型為int 方法名為add 參數為兩個int類型的數據
public static int add(int num1,int num2){
int c = num1 + num2;
return c;
}
//!在此擴展:在方法中定義的變量叫局部變量,只在該方法中有效,所以不同方法中的局部變量是可以重名的
//2.
//受保護的 靜態的 返回值類型為double 方法名為sub 參數為一個int,一個double類型的數據
protected static double sub(double num1,int num2){
//直接返回
return num1-num2;
}
//3.
//默認的 靜態的 返回值類型為void 方法名為show 參數為一個String類型的數據
static void show(String str){
System.out.println(str);
return;//可省略不寫
}
//4.
//私有的 靜態的 返回值類型為boolean 方法名為flag 參數為一個boolean類型的數據
private static boolean flag(boolean b){
if(b == true){
//b為true的話直接返回b,就不會繼續向下執行了
return b;
}
System.out.println(b);//只有b為false才會執行到這
return false;//不僅可以返回變量、表達式、也可返回固定的數據
}
//5.
//可變參數
public static void variableParameters(String name,int age,char sex,double...x){
System.out.println("可變參數");
}
public static void main(String[] args) {
//方法必須在main中被調用了才會執行!!!並且執行順序只與調用的順序有關,與方法的位置無關
//因為四個方法都為static,所以可以在main中直接調用
//static方法中只能直接調用static方法
//調用方式:方法名+參數(參數必須數據類型、順序一一匹配)
//有返回值的方法可以定義一個變量接收,並且可以輸出
int addResult = add(1, 2); //此處的1,2為實參,即實際的參數。上述方法中定義的為形式參數(相當於一個坑,這里就是實際填入這個坑的東西)
System.out.println(addResult);
//也可以不接收就直接輸出
System.out.println(sub(4.5,4));
//返回值為空的數據,不需要變量去接收,也不能放在輸出語句中
show("Hello,World!");
flag(true);
//以上方法的定義和使用,驗證了四個權限修飾符都可以定義方法,並且在本類中都可以被調用
System.out.println("===========================");
//可變參數的驗證
variableParameters("可變參數1",18,'男',1.1,1.2);//兩個參數
variableParameters("可變參數2",18,'女',1.1,1.2,1.3,1.4);//四個參數
}
}
分析運行結果:
add方法、show方法和sub方法都輸出了正確的結果;在flag方法中,因為flag為true,所以直接判斷返回了,沒有輸出false;可變參數的使用也是沒有問題的。