[備忘録 その１０] Java Silver ～クラス定義・オブジェクトの使用 その２～

# コンストラクタ
__コンストラクタ__ とは、クラスのインスタンス(オブジェクト)を生成する際に呼び出される特別なメソッドです。主にオブジェクトの初期化を行うために使用されます。コンストラクタはクラスと同じ名前を持ち、戻り値を持たないのが特徴です。

### コンストラクタの特徴

1 \. __クラス名と同じ名前__ ：コンストラクタの名前は、そのクラスの名前と同じでなければなりません。
2 \. __戻り値を持たない__ ：コンストラクタには戻り値の型がありません。これはメソッドと異なる特徴です。
3. \. __自動呼出し__ ：オブジェクトが作成されるときに、自動的に呼び出されます。
4 \. __オーバーロード可能__ ：引数の異なる複数のコンストラクタを定義することができます。

### コンストラクタの用途
* __オブジェクトの初期化__：インスタンス変数に初期値を設定したり、オブジェクトの状態を設定したりするために使用されます。
* __リソースの確保__：ファイル、データベース接続、ネットワーク接続などのリソースを確保する際に使用されます。

#### コンストラクタの例
```java
public class Car {
    private String color;
    private int speed;

    // デフォルトコンストラクタ
    public Car() {
        this.color = "unknown";
        this.speed = 0;
    }

    // パラメータ付きコンストラクタ
    public Car(String color, int speed) {
        this.color = color;
        this.speed = speed;
    }

    // メソッド
    public void display() {
        System.out.println("Car color: " + color + ", speed: " + speed);
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car(); // デフォルトコンストラクタの呼び出し
        car1.display(); // Car color: unknown, speed: 0

        Car car2 = new Car("red", 100); // パラメータ付きコンストラクタの呼び出し
        car2.display(); // Car color: red, speed: 100
    }
}
```
この例では、'Car'クラスには二つのコンストラクタが定義されています。
1 \. __デフォルトコンストラクタ__：引数を取らず、'color'を'unknown'、'speed'を'0'に初期化します。
2 \. __パラメータ付きコンストラクタ__：引数として'color'と'speed'を受け取り、それらをインスタンス変数に設定します。

### デフォルトコンストラクタ
もしクラスに明示的にコンストラクタを定義しない場合、Javaコンパイラは自動的に__デフォルトコンストラクタ__を生成します。このデフォルトコンストラクタは引数に取らず、オブジェクトをデフォルトの状態で初期化します。

### コンストラクタの役割と重要性
コンストラクタは、オブジェクトの生成と初期化を重要な要素です。適切に設計されたコンストラクタ、オブジェクトの使用準備を確実に行い、オブジェクトの不正な状態を防ぎます。また、必要に応じてオーバーロードすることで。オブジェクト生成の多様の方法を提供することができます。

# オーバーロード
__オーバーロード__ とは、同じ名前のメソッドを複数定義することです。ただし、それぞれのメソッドは異なる引数リスト(引数の数や型の組み合わせ)を持つ必要があります。オーバーロードは、同じ処理を異なる方法で実行するための柔軟性を提供します。

### オーバーロードの特徴
1\. __メソッド名が同じ__：オーバーロードされるメソッドは同じ名前を持ちます。

2\. __引数リストが異なる__：オーバーロードされたメソッドは、引数の数、型、または順序が異なる必要があります。これにより、コンパイラはどのメソッドが呼び出されるべきかを判別します。
3\. __戻りとの型は無関係__：戻り値の型が異なっていても、それだけではオーバーロードとはみなされません。引数リストが異なる必要があります。
```java
public class MathUtils {
    
    // 2つの整数の加算
    public int add(int a, int b) {
        return a + b;
    }
    
    // 3つの整数の加算
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    
    // 2つの小数の加算
    public double add(double a, double b) {
        return a + b;
    }
    
    // 1つの整数と1つの小数の加算
    public double add(int a, double b) {
        return a + b;
    }
}
```

### オーバーロードの利点
1\. __可動性の向上__：同じ名前のメソッドを使うことで、同じ動作をするメソッド群をわかりやすく整理できます。異なる引数の組み合わせに対応するために、異なる名前を付ける必要がなく、コードの可動性が向上します。
2\. __使い勝手の向上__：ユーザーはメソッド名を覚えやすくなり、異なる引数を渡すだけで同じメソッドを使うことができます。これにより、APIの使いやすさが向上します。
3\. __柔軟性の提供__：同じ名前のメソッドを異なる引数で提供することで、さまざまな状況に対応することができます。

### コンストラクタのオーバーロード
同じクラス内で異なる引数リストを持つ複数のコンストラクタを定義することを指します。
#### コンストラクタのオーバーロードの利点
1\. __柔軟なオブジェクト生成__：異なるコンストラクタを用意することで、オブジェクトの生成時に異なる初期データや設定を渡すことができます。
2\. __可読性と使いやすさの向上__：コンストラクタのオーバーロードにより、同じクラスのオブジェクトを生成するための複数の方法が提供され、クラスのインターフェースが統一されます。
#### コンストラクタのオーバーロードの例
```java
public class Person {
    private String name;
    private int age;
    private String address;

    // デフォルトコンストラクタ
    public Person() {
        this.name = "Unknown";
        this.age = 0;
        this.address = "Unknown";
    }

    // 名前と年齢を初期化するコンストラクタ
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        this.address = "Unknown";
    }

    // 名前、年齢、住所を初期化するコンストラクタ
    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void display() {
        System.out.println("Name: " + name + ", Age: " + age + ", Address: " + address);
    }
}
```

# 可変長引数
__可変長引数__ は、メソッドに渡す引数の数を可変にするための機能です。Javaでは、...（三点リーダー）を使って、メソッドに渡す引数の数を指定せずに複数の引数を渡すことができます。可変長引数を使用することで、異なる数の引数を取るメソッドをオーバーロードする必要がなくなり、コードが簡潔になります。

### 可変長引数の構文
```java
public void methodName(DataType... variableName) {
    // メソッドの本体
}
```
* 'DataType': 引数のデータ型。全ての引数はこの型に一致するか、互換性がある必要があります。
* 'variableName': 可変長引数の名前。配列のように扱われます。

#### 可変長引数の例
```java
public class VarargsExample {

    // 数の合計を計算するメソッド
    public static int sum(int... numbers) {
        int sum = 0;
        for (int num : numbers) {
            sum += num;
        }
        return sum;
    }

    public static void main(String[] args) {
        // 可変長引数メソッドの呼び出し
        System.out.println(sum(1, 2, 3)); // 6
        System.out.println(sum(10, 20)); // 30
        System.out.println(sum()); // 0
    }
}
```

#### 可変長引数の使用時の注意点
1\. __可変長引数の最後に__ ： 可変長引数は、引数リストの最後に記述する必要があります。
```java
// 正しい
public void correctMethod(String s, int... numbers) {
    // メソッドの本体
}

// コンパイルエラー
public void incorrectMethod(int... numbers, String s) {
    // メソッドの本体
}
```
2\. __可変長引数と配列の違い__：メソッド内では、可変長引数は配列として扱われます。しかし、メソッド呼び出し時には配列として渡す必要はありません。
3\.__可変長引数とほかの引数の組み合わせ__：可変長引数をほかの通常の引数と組み合わせて使用することができます。ただし、通常の引数を先に書く必要があります。
```java
public static void printNumbers(String label, int... numbers) {
    System.out.println(label + ": ");
    for (int num : numbers) {
        System.out.print(num + " ");
    }
    System.out.println();
}

public static void main(String[] args) {
    printNumbers("First", 1, 2, 3); // First: 1 2 3
    printNumbers("Second", 4, 5); // Second: 4 5
    printNumbers("Empty"); // Empty: 
}
```


最初のページ
[[備忘録 その１] Java Silver ～Javaプログラミング基礎～](https://qiita.com/MagicShowTime/items/9fcf3a2cb4a7162aafcf "[備忘録 その１] Java Silver ～Javaプログラミング基礎～")

前のページ
[[備忘録 その９] Java Silver ～クラス定義・オブジェクトの使用 その１～](https://qiita.com/MagicShowTime/items/f4b353f6aa1b4e8e6123 "[備忘録 その９] Java Silver ～クラス定義・オブジェクトの使用 その１～")

次のページ
[[備忘録 その１１] Java Silver ～クラス定義・オブジェクトの使用 その３～](https://qiita.com/MagicShowTime/items/8cca697305bac77a61be "[備忘録 その１１] Java Silver ～クラス定義・オブジェクトの使用 その３～")