【メソッドとカプセル化の操作②】オーバーロード、コンストラクタ

## はじめに
オラクル認定資格教科書 Javaプログラマ Silver SE８
第一章　Javaの基本　
第二章　Javaのデータ型の操作
第三章　演算子と判定構造の使用
第四章　配列の作成と使用
第五章　ループ構造の使用
第六章　メソッドとカプセル化の操作←　ｲﾏｺｺ！！
第七章　継承の操作
第八章　例外の処理
第九章　Java APIの主要なクラスの操作

## オーバーロード
　オーバーロードは、同名のメソッドを複数宣言できる機能。ただし、名前が同じでも**引数が異なること**が条件。
　引数が異なるとは、**引数の数や型、順番が異なること**。
　数、型、順番が同じで、引数の名前だけが異なる場合やアクセス修飾子が異なる場合は、引数が異なるとはみなされない。（コンパイルエラー）
```java
public class Sample {
  public void hello(){
    // do something
  }
  public void hello(int a){
    // do something
  }
  void hello(int a, String a){
    // do something
  }
}
--------------------------------
public static void main(String[] args) {
  Sample s = new Sample();
  s.hello(6);
  // 引数が同じのpublic void hello(int a)だけが呼ばれる
}
```
## コンストラクタ
　コンストラクタは、生成されたインスタンスがほかのインスタンスから使われる前に、
事前準備を整える「前準備」をするためのメソッドの一種である。
　コンストラクタは自由に定義ができ、また、オーバーロードして複数定義することも可能。
　また、コンストラクタはクラスに必須であるが、省略も可能である。定義しなかった場合は、コンパイラが自動で「デフォルトコンストラクタ」を追加する。

コンストラクタのルール
・メソッド名をクラス名と同じにする
・戻り値は記述できない
・newと一緒にしか使えない（インスタンス生成時にのみ実行される）
```java
public class Sample {
  [アクセス修飾子] クラス名(引数) {
	// do something
  }
}
//voidや戻り値型を記述した場合、コンストラクタではなく、通常のメソッドとみなされる
```
### コンストラクタのアクセス修飾子でインスタンス化を制御
　コンストラクタの修飾子でインスタンス生成を制御できる。
　例）修飾子なしの場合、同じパッケージの属するクラスでしか、インスタンスを生成できない。
|修飾子|説明|
|:--|:--|
|public|すべてのクラスからアクセス可能|
|protected|同じパッケージか継承しているサブクラスからのみアクセス可能|
|なし|同じパッケージからのみアクセス可能|
|private|クラス内からのみアクセス可能|

### コンストラクタのオーバーロード
　コンストラクタはメソッドの一種であるため、オーバーロードして複数定義することも可能。
```java
public class Sample {
  public Sample() {
    // do something
  }
  public Sample(String str, int num) {
    // do something
  }
}
```
　コンストラクタから別のオーバーロードされたコンストラクタを呼ぶ際は「**this**」を使用する。
　また、ほかのコンストラクタを呼ぶ場合は、処理よりも前、**一番最初に記述**しなければいけない。
```java
public class Sample {
  public Sample() {
    this("A"); // 必ず一番最初に記述する
    System.out.println("B");
  }
  public Sample(String str) {
    System.out.println(str);
  }
}
```
### 初期化ブロック
　初期化ブロックは**コンストラクタよりも先に実行される**処理を書くためのものであり、
オーバーロードされた複数のコンストラクタで同じ処理を先に実行させたい場合に利用する。
 初期化ブロックは **中カッコ「{}」** で定義する。
```java
public class Sample {
  Sample() {
    System.out.println("A");
  }
  //↓↓初期化ブロック↓↓
  {
    System.out.println("B");
  }
}
//結果：　B A
//初期化ブロックがコンストラクタよりも先に実行されるため、B Aとなる
```

## リンク集
[【Javaの基本①】クラスの構造](https://qiita.com/vitamin_b12/items/3f920cd223fd3cc1ceae)
[【Javaの基本②】パッケージとインポート](https://qiita.com/vitamin_b12/items/be766c8c3ef2366d9fea)
[【継承の操作②】インターフェース](https://qiita.com/vitamin_b12/items/cdc76298d7f6a494dff2)
[【Javaのデータ型の操作①】プリミティブ型のデータ・参照型](https://qiita.com/vitamin_b12/items/f922ab56e4d8b6580f49)
[【演算子と判定構造の使用①】論理演算子(&&、||)、同一性（==）、同値性(equals)](https://qiita.com/vitamin_b12/items/9feb89e8fb1bc67a8d6d)
[【演算子と判定構造の使用②】分岐処理(if、swich)](https://qiita.com/vitamin_b12/items/523467908e683474eac7)
[【配列の作成と使用】](https://qiita.com/vitamin_b12/items/2fc45588640c479e1f4d)
[【ループ構造の使用】while文、do-while文、for文、拡張for文](https://qiita.com/vitamin_b12/items/23d853dda9baf727e4ac)
[【メソッドとカプセル化の操作①】メソッドの概要](https://qiita.com/vitamin_b12/items/215ad731221c2691c441)
[【メソッドとカプセル化の操作②】オーバーロード、コンストラクタ](https://qiita.com/vitamin_b12/items/e4fd3d51a35bb6a5566c)
[【継承の操作①】クラスの継承](https://qiita.com/vitamin_b12/items/19f8ad6f9801ac8f6a8f)
[【例外の処理】](https://qiita.com/vitamin_b12/items/f7ebf2c1106a7dcbdb41)
[【Java APIの主要なクラスの操作】](https://qiita.com/vitamin_b12/items/dcd3edfe2273e5a09231)