【Java】継承について復習 していく

#目的

* 継承について学んだことを例題に沿って復習する

#実際の手順と実例
###1.継承とは

意味としてはそのままでした。

> あるクラスを作っているときに、クラスの一部を変更して使いまわしたいときに利用できる実装

参照：[今すぐ分かる！Javaで書くクラスの継承【初心者向け】](https://techacademy.jp/magazine/9246)


継承する元のクラスを「スーパークラス（親クラス、基底クラス）」と呼び、継承する先のクラスを「サブクラス（子クラス、派生クラス）」と呼びます。

###2.継承で覚えるべきこと

####1.抽象クラス

抽象メソッドを1つ以上持つクラスのことです。抽象メソッドとは、処理を記述せずにメソッド名や引数、戻り値だけを定義したメソッドのこと
→　各継承先で（サブクラスで）処理だけ変えて使える

**基本構文**

```java
アクセス修飾子 abstract class クラス名 {
    // 抽象メソッドの宣言
    アクセス修飾子 abstract 戻り値の型 メソッド名(引数);
}
```

####2.インターフェース

インターフェースは分からなかったので下記の記事を参考にさせて頂きました。

> クラスに含まれるメソッドの具体的な処理内容を記述せず、変数とメソッドの型のみを定義したもの

参考：[【Java入門】インターフェースとは？抽象クラス（abstract）との違い](https://www.internetacademy.jp/it/programming/java/difference-between-interface-and-abstract.html#:~:text=%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB-,Java%E3%81%AE%E3%80%8C%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%EF%BC%88interface%EF%BC%89%E3%80%8D%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82)

**基本構文**

```java
[public] interface インターフェース名 extends インターフェース名, インターフェース名 {
    // フィールドの宣言（定数）
    (public static final) 定数の型 定数名 = 初期値;
    // メソッドの宣言（抽象メソッド）
    (public abstract) 戻り値の型 メソッド名(引数);
}
```

####3.defaultメソッド

インターフェース内にデフォルトの処理を実装したメソッドを定義するための機能です。

**基本構文**

````java
[public] interface インターフェース名 extends インターフェース名, インターフェース名 {
    // デフォルトメソッドの宣言
    default 戻り値の型 メソッド名() {
        // デフォルト処理
    }
}
````

続いて問題を見ながら進めていきます。
例題はスクールのカリキュラムを参考にして、どのように考えてコードを書いたのか、コメントを自分で残していきます。

###3.例題

####問題

「Chapter13.java」を実行した結果が以下になるように、「FlyingPhone.java」を作成してください。

`````
写真をとります。
000-1111-2222 から 99-8888-7777 に電話をかけます。
電源を切ります。
5 分間、飛びます。 
000-1111-2222 に電話します。通話できるのは飛んでいる間だけです。
飛んでいる場合は落下します。
`````

####解答

Phone.javaが親クラス

````Phone.java
package extend.phone;
//インターフェイスしたもの
public interface Phone {
//	フィールドを定義
    int MAX_NUMBER_DIGITS = 11;
//    callという変数をここで定義
    public void call(String number);
//    デフォルトメソッドを使用して,powerOffメソッドを定義
    default void powerOff() {
    	System.out.println("電話を切ります。");
    }
}
````
もう一つ親クラスを作成

````Flying.java
package practice;

public interface Flying {

    // メソッド（抽象メソッド）
    void fly();

    // defaultメソッド//    デフォルトメソッドを使用して,powerOffメソッドを定義
    default void powerOff() {
        System.out.println("飛んでいる場合は落下します。");
    }
}
````

````MobilePhone.java
package extend.phone;

//インターフェースを継承（Phone)継承元ではinterface, 子クラスではimplimentsを使う
public class MobilePhone implements Phone {
//	フィールドを定義
	private String number;
//	Mobilephone,takePivctureそれぞれメソッドを定義
	public MobilePhone(String number) {
		this.number = number;
	}
	public void takePicture() {
		System.out.println("写真を取ります");
	}
//	callはPhoneで作成したメソッドを継承している
	public void call(String number) {
		System.out.println(this.number + "から"+  number + "に電話をかけます。");
		
	}
}
````

```FlyingPhone.java
package practice;

import extend.phone.Phone;
//PhoneとFlyingからそれぞれ継承（インターフェースを実装）
public class FlyingPhone implements Phone, Flying {
//	新たにフィールドを宣言
    private int count;
    
	public FlyingPhone(int count) {
		this.count = count;
	}
//    抽象メソッドから持ってきている
	public void fly() {
		System.out.println(count + "分間飛びます");
	}
//	callはPhoneから持ってきている
	public void call(String number) {
		System.out.println(number + "に電話します。通話できるのは飛んでいる間だけです.");
	}
//	defaultメソッドから実装(親元から持ってくるときはsuper変数を使う)
	public void powerOff() {
		Flying.super.powerOff();
	}   
}
```


最後に実行ファイルを作成

`````Chapter13.java
package practice;

import extend.phone.MobilePhone;
import extend.phone.Phone;

public class Chapter13 {
    public static void main(String[] args) {
        // MobilePhoneインスタンスを生成
        MobilePhone mobilePhone = new MobilePhone("000-1111-2222");
        mobilePhone.takePicture();
        Chapter13.staticCall(mobilePhone, "99-8888-7777");
        mobilePhone.powerOff();

        // flyingPhoneインスタンスを生成
        FlyingPhone flyingPhone = new FlyingPhone(5);
        flyingPhone.fly();
        Chapter13.staticCall(flyingPhone, "000-1111-2222");
        flyingPhone.powerOff();
    }

    public static void staticCall(Phone phone, String number) {
        phone.call(number);
    }
}

`````


#参考にさせて頂いた記事

* [【Java入門】インターフェースとは？抽象クラス（abstract）との違い](https://www.internetacademy.jp/it/programming/java/difference-between-interface-and-abstract.html#:~:text=%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB-,Java%E3%81%AE%E3%80%8C%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%EF%BC%88interface%EF%BC%89%E3%80%8D%E3%81%A8%E3%81%AF%EF%BC%9F,%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82)
* [今すぐ分かる！Javaで書くクラスの継承【初心者向け】](https://techacademy.jp/magazine/9246)