Javaの引数と戻り値とオーバーロード

###引数
引数とはメソッドに与える追加情報のようなものです。
メソッドを呼び出すときに、一緒に引数を渡すと、メソッドの中でその値を利用できます。
メソッドに引数を渡すには、まず引数を受け取れるメソッドを定義します。
そのためにはメソッドの定義部分で、引数を受け取る変数（仮引数）を指定します。

```Main.java
public static void メソッド名(データ型 変数名) {  //データ型 変数名は仮引数です
  実行する処理;
}
```
【例】

```Main.java
class Main {
  public static void main(String[] args) {
    nameData("佐藤");
    nameData("鈴木");
    
  }
  public static void nameData(String name) {    // 引数を受け取るようにしてます
    System.out.println("名前は"+name+"です");
  }
}
```
上記の例だとnameDataはメソッドで、(String name)はデータ型 変数名です。
System.out.println("名前は"+name+"です");は実行する処理です。
「名前は佐藤です」と「名前な鈴木です」が結果として出てきます。
####複数の引数
メソッドが複数の引数を受け取るためには、仮引数をコンマ（,）で区切って定義します。

```Main.java
public static void メソッド名(データ型 変数名,データ型 変数名) {  //左から第一引数、第二引数です
  実行する処理;
}
```
【例】

```Main.java
class Main {
  public static void main(String[] args) {
    nameData("佐藤",20);
    nameData("鈴木",30);
    
  }
  public static void nameData(String name,int age) {    // 引数を受け取るようにしてます
    System.out.println("名前は"+name+"で年齢は"+age+"です");
  }
}
```
「名前は佐藤で年齢は20です」と「名前な鈴木で年齢は30です」が結果として出てきます。
###戻り値
メソッドの処理結果を、メソッドの呼び出し元で使いたい場合は、メソッドが戻り値を返すようにします。
例えば、メソッドを工場として考えると、工場（メソッド）は、発注者（mainメソッドとします）から材料（引数）を受け取り、決められた加工（処理）を行って完成品を発注者に返します。この完成品が戻り値と考えてください。
####return
メソッドの中でreturnを使うと、returnの値をメソッドの呼び出し元に返すことができます。
また、戻り値があるメソッドは、戻り値のデータ型を指定します。
「public static void」のvoidの部分で指定します。今まで使っていたvoidは戻り値がない、という意味です。

```Main.java
public static 戻り値のデータ型 メソッド名(引数) {
  return 戻り値;
}
```
【例】

```Main.java
public static int main(int a,int b) {
  return a + b;
}
```
上記の例だとintが戻り値のデータ型、mainがメソッド名、int a,int bが引数、a + bが戻り値でreturnで呼び出し元に値を返します。
【例】

```Main.java
class Main {
  public static void main(String[] args) {
    String name = fullName("佐藤", "太郎");  // fullNameメソッドの結果を変数nameに代入してます
    nameData(name,20);  // nameDataの引数をnameに置き換えています。
    nameData("鈴木アントニー次郎", 30);   
  }

  public static void nameData(String name, int age) {
    System.out.println(""名前は"+name+"で年齢は"+age+"です");
  }
  // fullNameメソッドを定義しています
  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }
}
```
上記の結果は
私の名前は佐藤太郎で年齢は20です
私の名前は鈴木次郎で年齢は30です
となります。
###メソッドのオーバーロード
まずメソッドに同名は定義できません。同じメソッドが複数存在すると、メソッドを呼び出したときにどのメソッドを用いればいいのかわからなくなるためです。
ただし、引数の型や個数が違う場合は同名のメソッドを定義できます。同名のメソッドがあっても、引数が違えばどれを呼べばいいのかがわかるためです。
同名のメソッドを定義することをオーバーロードと言います。

```Main.java
public static void main(String[] args) {
    hello();  //引数がないメソッド
    hello("佐藤");  //String型の引数をもつメソッド
  }
```

```Main.java
public static void hello() {  //引数がないメソッド
    System.out.println("おはよう");
}
public static void hello(String name) {  //String型の引数をもつメソッド
    System.out.println("おはよう" + name);
  }
```
helloとメソッドは同名だが引数が異なるため同名のメソッドを定義ができます。
【例】

```Main.java
class Main {
  public static void main(String[] args) {
    nameData(fullName("佐藤", "太郎"), 20);
    nameData(fullName("鈴木", "アントニー", "次郎"), 30);
  }

  public static void nameData(String name, int age) {
   System.out.println("名前は"+name+"で年齢は"+age+"です");
  }

  public static String fullName(String firstName, String lastName) {
    return firstName + " " + lastName;
  }
 
  public static String fullName(String firstName, String middleName, String lastName) {
   return firstName + " " + middleName + " " + lastName;
  }
}
```