一、什麼是方法
方法是用來完成特定功能的代碼片段。
比如說我們最常用的 System.out.println();
這一段代碼中 println()
就是方法,它完成的特定功能是在控制檯輸出我們需要輸出的內容。
二、方法該怎麼寫
修飾符 返回值類型 方法名稱 (參數類型 參數名稱){
...方法體...
return 返回值;
}
- 修飾符:定義方法訪問的權限,有默認值,具體修飾符開 附錄Ⅰ。
- 返回值類型:說明方法進行後返回數據的類型,方法執行後沒有返回結果就寫
void
,不能省略不寫。 - 方法名:方法名是給代碼段起一個名字,方便調用方法。名字要符合命名規範。
- 參數類型:參數就像一個佔位符,方法內部使用參數來模擬傳入的數據;如果參數傳入值,佔位符就會直接被參數替換掉。如果方法不需要參數,可以省略不寫。
- 方法體:完成特定功能的代碼段。
- 返回值:當代碼執行完成後應該告訴調用者的內容,當然也可以什麼也不告訴,我們只要不寫
return
就表示沒有返回值。
// 實例:寫一個計算2個整數的和的方法
//修飾符 返回值 方法名 參數類型 參數名稱
public static int add (int number1, int number2) {
// 方法體
int sum = number1 + number2;
// 返回值
return sum;
}
三、方法如何調用
方法名(參數值);
- 方法名:我們在寫方法時定義的名字。
- 參數值:方法在定義時需要我們傳入的值,比如上面的方法sum就需要我們傳入2個整數,我們在調用方法時就應該把2個整數值傳遞過去,如果調用時不傳入參數,程序就會報錯。
- 如果方法有返回值的,我們可以使用一個變量存放起來,便於後面使用。
public static void main(String[] args) {
// 方法的調用
int sum = add(1,2);
// 使用方法的返回值
System.out.println(sum);
}
// 輸出
3
四、方法的重載
書寫一個 同名不同參 的方法,這種行爲叫做方法的重載。
- 方法名必須相同,如果不同就不能稱爲重載。
- 參數必須不同,可以是類型或者數量不同。
- 返回值類型不影響方法的重載,只要符合上面的2種情況即可。
// 書寫一個add的重載方法,使其能計算2個double類型的數字之和
public static double add (double number1, double number2) {
// 方法體
double sum = number1 + number2;
// 返回值
return sum;
}
- 在調用
add
方法時,jvm會根據傳入的參數去匹配對應的方法。
public static void main(String[] args) {
// 方法的調用
int sum = add(1, 2);
// 使用方法的返回值
System.out.println(sum);
double sum2 = add(1.0, 2.0);
System.out.println(sum2);
}
// 輸出
3
3.0
五、不定項參數
在傳遞參數時,在參數類型的後面添加
...
表示這個參數爲不定項參數,也就是同類型的參數可以書寫多個。
- 不定項參數支持 jdk1.5+
- 不定項參數只能放在參數的最後一個,普通參數放在前面。
// 實例:根據傳入的整數,計算整數之和
public static double add(double... numbers) {
System.out.println("不定項參數");
// 方法體
double sum = 0.0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
// 返回值
return sum;
}
- 在調用方法時,固定參數優先級大於不定項參數方法。
public static void main(String[] args) {
// 方法的調用
int sum = add(1, 2);
// 使用方法的返回值
System.out.println(sum);
// 符合條件的方法存在2個,這是會根據優先級大小來調用
double sum2 = add(1.0, 2.0);
System.out.println(sum2);
double sum3 = add(1.0, 2.0, 3.0);
System.out.println(sum2);
}
// 輸出
3
重載add方法
3.0
不定項參數
3.0
六、遞歸
函數調用它自身的情況成爲遞歸
- 新的問題和原來的問題有同樣的解決方式時我們可以遞歸。
- 必須存在一種可能,使遞歸可以被結束。
// 實例:遍歷文件夾下的所有子文件。
// 文件夾下即可能存在文件,也可能是文件夾,
// 如果是文件夾,那麼它下面也即可能存在文件,也可能是文件夾,
// 這樣子文件夾的問題和我們要查詢的總文件夾有同樣的處理方式,這時我們就可以使用遞歸來處理。
public static void dirAllFile(File file) {
// 獲取文件夾的文件列表
File[] files = file.listFiles();
Optional<File[]> optionalFiles = Optional.ofNullable(files);
// 判斷是否存在文件
if (optionalFiles.isPresent()) {
// 存在文件就比遍歷文件
for (File temp : optionalFiles.get()) {
// 如果當前的對象是一個文件夾,我們需要遍歷文件夾下的所有文件
if (temp.isDirectory()) {
System.out.println("目錄=" + temp.getName());
// 遞歸
dirAllFile(temp);
} else {
System.out.println("\t文件=" + temp.getName());
}
}
}
}
// 調用
public static void main(String[] args) {
dirAllFile(new File("E:\\項目\\security"));
}
// 輸出
目錄=exception
文件=ValidateCodeException.java
目錄=filter
文件=JwtAuthenticationTokenFilter.java
文件=ValidateCodeFilter.java
目錄=handle
文件=AuthenticationEntryPointImpl.java
文件=JsonAccessDeniedHandler.java
文件=JsonAuthenticationEntryPoint.java
文件=JsonFailureHandler.java
文件=JsonLogoutSuccessHandler.java
文件=JsonSuccessHandler.java
文件=LogoutSuccessHandlerImpl.java
文件=LoginBody.java
文件=LoginUser.java
目錄=model
文件=LoginBody.java
文件=LoginUser.java
文件=SecurityConfig.java
文件=SecurityUtils.java
目錄=service
文件=PermissionService.java
文件=SysLoginService.java
文件=SysPermissionService.java
文件=TokenService.java
文件=UrlAccessDecisionManager.java
文件=UrlFilterInvocationSecurityMetadataSource.java
文件=UserDetailsServiceImpl.java
下面這張圖片是實際的文件樹
- 遞歸會根據數據一直調用自身,層數越多消耗的資源越多,數據量大時不建議使用;假設你要遍歷整個磁盤的文件,這時就不建議使用。
附錄Ⅰ 方法修飾符
默認值default,不寫修飾符即默認default;Y 表示可以訪問,N表不可訪問。
修飾符 | 當前類 | 同一個包 | 子孫類(同一包) | 子孫類(不同包) | 其他包 |
---|---|---|---|---|---|
public | Y | Y | Y | Y | Y |
protected | Y | Y | Y | N | |
default | Y | Y | Y | N | N |
private | Y | N | N | N | N |