---
# System prepended metadata

title: '狂神說Java學習筆記 : Java方法'
tags: [Java基礎, 狂神說Java]

---

# 狂神說Java學習筆記 : Java方法
***
> **即使再小的帆也能遠航**

>**本篇學習筆記參考自[狂神說](https://www.bilibili.com/video/BV12J41137hu/)**

>###### tags: `狂神說Java` `Java基礎`
***
# 什麼是方法?
- 大原則 : 一個方法只完成一個功能，如此有利於後續功能擴展。
![](https://i.imgur.com/rI1cFL2.jpg)
***
# 方法的定義和調用
- Java方法類似於其他程式語言的函數，用來完成特定功能的程式片段
- 命名規則
    ```java
    修飾符 返回值類型 方法名(參數類型 參數名){
        ...
        方法體
        ...
        return 返回值
    }
    ```
- 兩種調用方式
    - 會返回值的，通常被當作一個值
    ``` java
    int larger = max(10 ,20);
    ```
    - 返回為void，則一定為語句 
    ``` java
    System.out.println("Hello World!")
    ```
- 補充 : Java 屬於**值傳遞**
    - 還有一種是引用傳遞，概念為C的指標 (地址傳遞)。
    - [補充文章](https://www.kuangstudy.com/bbs/1382226379252191234)
***
# 方法的重載
- **定義 :** 在一個類中，有相同的函數名稱，但***形參不同***的函數
    - **方法名稱相同**
    - **參數列表必須不同(個數、類型、排列順序)**
    - 返回類型可以相同或不相同 
![](https://i.imgur.com/vOKWy7f.jpg =500x)
***
# 命令行傳遞參數
```java=
package method;

public class Demo03 {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.println("args[" + i + "]:" + args[i]);
        }
    }
}
```
- cd ..是為了處理package位置的問題
![](https://i.imgur.com/9SUfVIC.jpg =500x)
# 可變參數
- 又稱"不定項參數"，從JDK 1.5開始支援
- 聲明方法 : 指定參數類型後加省略號(*e.g.* double...)
- 一個方法只能有一個可變參數，且必須是最後一個參數，任何普通參數都得在他前面聲明
- 本質即為下一章的**數組**
```jav=
package method;

public class Demo04 {
    public static void main(String[] args) {
        // 調用可變參數的方法
        printMax(34, 3, 3, 2, 56.6);
        printMax(new double[]{1, 2, 3});
    }

    public static void printMax(double... numbers){
        if (numbers.length == 0){
            System.out.println("No argument passed.");
            return;
        }

        double result = numbers[0];

        // 取極值!
        for (int i = 1; i < numbers.length; i++) {
            if (numbers[i] > result) {
                result = numbers[i];                
            }
        }

        System.out.println("The max value is " + result);
    }
}
```
***
# 遞歸
- 遞歸一定要有終點，否則會死循環
- **能不用遞歸就不用遞歸**，除非層數較小
```java=
public class Demo06 {
    // 階層
    public static void main(String[] args) {
        System.out.println(factorial(5)); 
    }

    public static int factorial(int n){
        if (n == 1){
            return 1;
        } else{
            return n * factorial(n-1);
        }
    }
}
```
***
# 作業 : 簡易計算機
- 寫一個計算機，要求實現加減乘除功能，並且能夠循環接收新的數據，通過用戶交互實現。
- 思路推薦:
    1. 寫四個方法 : 加減乘除
    2. 利用循環 + switch進行用戶交互
    3. 傳遞需要操作的兩個數
    4. 輸出結果
- 自己的方法
    - 沒有很全面，但正常使用不會有問題。
    - 有趣的地方，"==" 用於比較位址，"equals"才能比較是否相等
```java=
import java.util.Scanner;

public class Calculator {
    public static void main(String[] args) {   
        Scanner scanner = new Scanner(System.in);
        boolean flag = true;

        while (flag) {
            // Input first number
            double num1 =0;
            System.out.print("請輸入第一個數: ");
            num1 = scanner.nextDouble(); 

            // Input Operator
            String op = "";
            System.out.print("請輸入運算元: ");
            op = scanner.next(); 

            // Input second number
            double num2 =0;
            System.out.print("請輸入第二個數: ");
            num2 = scanner.nextDouble(); 

            // Calculation
            double result = 0.0;
            result = calculator(num1, op, num2);
            System.out.println("The result is : " + result);

            // One more time?
            System.out.println("還要再繼續使用嗎(y/n)?");
            if ( scanner.next().equals("n") ){
                flag = false;
            }
        }
        scanner.close();
    }

    public static double calculator(double a, String operator, double b){
        switch (operator) {
            case "+":
                return a+b;
            case "-":
                return a-b;
            case "*":
                return a*b;
            case "/":
                return a/b;        
            default:
                System.out.println("Wrong Operator!!");
                return 0.0;
        }
    }
}
```

