【わかりやすく解説‼】Javaの継承の使い方【オーバーライドの解説あり】

## 1.事前知識
- [【最新】UbuntuでJavaの環境を構築する方法](https://qiita.com/ryome/items/37c53e9638a9c6ea146a)

- [【初心者でもできる‼】Windows10にJava環境を作る方法（JDK14.0.1）](https://qiita.com/ryome/items/30135570954e36196821)

- [【わかりやすく解説‼】Javaのインスタンスの使い方](https://qiita.com/ryome/items/62ba0d8395af6698053a)

- [【初心者でもできる‼】Windows10にEclipseをインストールする方法（Java環境構築）](https://qiita.com/ryome/items/b47c5acdaa52cffbec58)

事前知識として、上記リンクの内容が必要です。


## 2.継承とは

- `継承` とは、 `既に定義されているクラス` を元に、 `拡張や変更` を加えたクラスを定義すること。
- 継承の元になるクラスを「`スーパークラス`」という。
- 継承により新たに定義したクラスを「`サブクラス`」という。
- `サブクラス` の定義は、「`サブクラス名 extends スーパークラス名`」で行う。
- `サブクラス` では、スーパークラスとの `差の分` だけ記述します。
- Javaは言語の仕様上、1つのクラスに対して、 `スーパークラス` を `1つ` しか定義できない。
- `サブクラス` をさらに `継承` し、 `サブクラス` を作ることができる。
- すべてのクラスは、 `Java標準クラスライブラリ（Java API）` に定義された [java.lang.Objectクラス](https://docs.oracle.com/javase/jp/7/api/java/lang/Object.html) を継承している。
- `fainal修飾子` が付いているクラスは `継承` できない。
- スーパークラスの `private変数` に対しては、サブクラスから `直接アクセス` はできない。
- サブクラスのインスタンス化では、 `スーパークラスのコンストラクタ` の処理が行われた後に `サブクラスのコンストラクタ` の処理が行われる。
- サブクラスのコンストラクタの最初に `super()` を書くことで `スーパークラスのコンストラクタ` を任意に呼び出すことができる。
- `オーバーライド` を使用することでスーパークラスで定義されたメソッドをサブクラスで `再定義 `できる。


## 3.オーバーライドとは

- `オーバーライド` とは、スーパークラスで定義されたメソッドをサブクラスで `再定義 `すること。
- `オーバーライド` は、スーパークラスのメソッドと同じメソッド名・引数で、 `異なる処理` したい場合に使用する。
- `オーバーライド` の基本的な記述例は以下の通りである。

```PHP:スーパークラス
class スーパークラス名{

    // スーパークラスメソッド
    メソッド名(){
        //処理
    }
}
```

```PHP:サブクラス
class サブクラス名 extends スーパークラス名 {

    // オーバーライド
    @Override
    メソッド名(){
        //処理
    }
}
```

## 4.継承の基本的な書き方

```PHP:テストクラス
package パッケージ名;
public class メインクラス名{
    public static void main(String[] args) {
        // インスタンスの生成
        サブクラス名 変数名 = new サブクラス名();
        // setterに値を入れる
        変数名.setインスタンス変数名(実引数);
        // getterで入れた値の取得をする
        System.out.println(変数名.getインスタンス変数名());
    }
}

```

```PHP:スーパークラス

package パッケージ名;
class スーパークラス名{
    // インスタンス変数の定義
    private 型名 変数名;

    // コンストラクタ（インスタンス生成時に実行される）
    スーパークラス名(型名 引数){
        初期化処理など
    }
    // setter
    void setインスタンス変数名(型名 引数名){
        this.変数名 = 引数名;
    }
    // getter
    型名 getインスタンス変数名(){
        return 変数名;
    }
}
```

```PHP:サブクラス
package パッケージ名;
class サブクラス名 extends スーパークラス名{
    // インスタンス変数の定義
    private 型名 変数名;

    // コンストラクタ（インスタンス生成時に実行される）
    サブクラス名(型名 引数){
        super(引数);
        初期化処理など
    }
    // setter
    void setインスタンス変数名(型名 引数名){
        this.変数名 = 引数名;
    }
    // getter
    型名 getインスタンス変数名(){
        return 変数名;
    }
}
```

- 基本的なカプセル化は上記のように記述します。

## 5.事前準備
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/866ce029-9f28-05d3-ab0b-5e7b0467aafa.png)
1. Eclipseを起動し、 `[ファイル(F)]→[新規(N)]→[Java プロジェクト]` を選択する。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/f1c5cc3c-449f-a66a-caef-d5f681054041.png)
2. プロジェクト名に `Test1` と入力し、 `完了` ボタンをクリックする。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/a98626bb-291e-6aa8-5d69-df243d1673ca.png)
3. `[ファイル(F)]→[新規(N)]→[クラス]` を選択する。　　　
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/d0382456-4dd1-7474-4fbf-79735739b62c.png)
4. パッケージと名前に `Test1` と入力し、 `完了` ボタンをクリックする。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/deff58a6-dfe5-ec36-8a1c-e0d7d7c9833b.png)
5. `Test1.java` が作成されたことを確認する。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/a096d3b3-3505-097a-363c-222b44be7074.png)
6. 3と同様の手順でパッケージに `Test1` と入力し、 名前に `TestSuper` と入力し、 `完了` ボタンをクリックする。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/080b58b0-6cc6-4e0a-a698-238e25694db5.png)
7. `TestSuper.java` が作成されたことを確認する。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/d1b4f88b-6109-c917-203d-4cc31c3bf61b.png)
8. 3と同様の手順でパッケージに `Test1` 、名前に `TestSub` と入力し、 `完了` ボタンをクリックする。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/c2b2e58a-f9b1-42c1-208f-d28b4b7c5d0d.png)
9. `Test1.java` 、 `TestSuper.java` 、 `TestSub.java` が作成されれば成功。

## 6.記述例

```java:Test1.java
package Test1;
public class Test1 {
	public static void main(String[] args) {
        // インスタンスの生成
		TestSuper ts1 = new TestSuper("A");
		TestSub ts2 = new TestSub("B","ぎょうざ");

		// インスタンスの表示
		ts1.showName();
		System.out.println();
		ts2.showName();
    }
}
```

```java:TestSuper.java
package Test1;
public class TestSuper {
	// インスタンス変数の定義
    private String name;

    // コンストラクタ（インスタンス生成時に実行される）
    public TestSuper(String name) {
		this.name = name;
	}
    // setter
	public void setName(String name) {
		this.name = name;
	}
	// getter
	public String getName() {
		return name;
	}
	public void showName() {
		System.out.println("名前:"+name);
	}
}
```

```java:TestSub.java
package Test1;
public class TestSub extends TestSuper {
	// インスタンス変数の定義
    private String food;

 // コンストラクタ（インスタンス生成時に実行される）
	public TestSub(String name,String food) {
		super(name);
		this.food = food;
	}
	// setter
	public void setFood(String food) {
		this.food = food;
	}
    // getter
	public String getFood() {
		return food;
	}
	@Override
	public void showName() {
		super.showName();
		showFood();
	}
	public void showFood() {
		System.out.println("好きな食べ物:"+food);
	}
}
```

- 上記の文をコピーして、文字コードは `S-JIS` を指定し、ファイル名を `Test1.java` , `TestSuper.java` , `TestSuper.java` で保存し、実行するとこうなります。↓↓　　　　　　　　　　　　　　　　　　　　　　　　　　
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/4c10d90a-674e-7ccd-9ebf-e3f3a9e8e8f2.png)

## 7.GitHub
GitHubにソースコードを公開しています。

https://github.com/ryomeblog/qiita/tree/master/%E3%80%90%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC%E2%80%BC%E3%80%91Java%E3%81%AE%E7%B6%99%E6%89%BF%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%80%90%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89%E3%81%AE%E8%A7%A3%E8%AA%AC%E3%81%82%E3%82%8A%E3%80%91


## 8.関連
- [【覚えておくと便利!!!】Eclipseにおけるコンストラクタとgetter/setterの簡易作成](https://qiita.com/ryome/items/6c487ccc0c39847cd55f)
- [【初心者でもできる‼】Javadocの書き方](https://qiita.com/ryome/items/4f2d5928c8aaf195f407)
- [【わかりやすく解説‼】Javaのカプセル化の使い方](https://qiita.com/ryome/items/fc44dfad297b35bf7559)
- [【わかりやすく解説‼】Javaのオーバーロードの使い方](https://qiita.com/ryome/items/f1ca8cc7538f4c6d26c0)