【わかりやすく解説‼】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.参照型の型変換とは

- `参照型の型変換` には、 `アップキャスト` と `ダウンキャスト` がある。
- `アップキャスト` は、サブクラスのインスタンスを `スーパークラス型のオブジェクト` として扱うこと。
- `ダウンキャスト` は、スーパークラスのインスタンスを `サブクラス型のオブジェクト` として扱うこと。
- `ダウンキャスト` は、キャスト演算子「()」を使用して行う。

## 3.基本的な書き方

```PHP:アップキャスト
public class メインクラス名{
    public static void main(String[] args) {
        // インスタンスの生成
        サブクラス名 変数名1 = new サブクラス名();
        // アップキャスト
        スーパークラス名 変数名2 = 変数名1;
    }
}
```

```PHP:ダウンキャスト
public class メインクラス名{
    public static void main(String[] args) {
        // インスタンスの生成
        スーパークラス名 変数名1 = new サブクラス名();
        // アップキャスト
        サブクラス名 変数名2 = (サブクラス名)変数名1;
    }
}
```


- 基本的な参照型の型変換は上記のように記述する。

## 4.事前準備
![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` が作成されたことを確認する。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/d9dc314e-787b-9051-1b45-bfba6d8ea001.png)
6. 3と同様の手順でパッケージに `Test1` , 名前に `Hello` と入力し、 `完了` ボタンをクリックする。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/ba30c99a-a36a-5892-1be8-f62722800b10.png)
8. 3と同様の手順でパッケージに `Test1` , 名前に `GoodMorning` , スーパークラスに `Hello` と入力し、 `完了` ボタンをクリックする。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/ae954fe4-021c-079e-9a6b-ee189158eb65.png)
9. 3と同様の手順でパッケージに `Test1` , 名前に `GoodEvening` , スーパークラスに `GoodMorning` と入力し、 `完了` ボタンをクリックする。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/cbef1be4-a51a-5521-43c7-098d88017d1e.png)
10. `Test1.java` , `Hello.java` , `GoodMorning.java` , `GoodEvening.java` が作成されれば成功。

## 5.記述例

- `参照型の型変換` は、 `スーパークラス` または `サブクラス` が 持っている `メソッドの呼び出し` や `メソッドの定義範囲を変える` ために使用する。

```java:Test1.java
package Test1;
public class Test1 {
    public static void main(String[] args) {
        // インスタンスの生成
        GoodEvening ge1 = new GoodEvening("A");
        ge1.showGoodMorning();

        // アップキャスト
        Hello hello = ge1;
        hello.showHello();

        // ダウンキャスト
        GoodEvening ge2 = (GoodEvening) hello;
        ge2.showGoodEvening();
        //((GoodEvening) hello).showGoodEvening();
    }
}
```

```java:Hello.java
package Test1;
public class Hello{
	// 変数の定義
	String name;

	// コンストラクタ
	public Hello(String name) {
		this.name = name;
	}

	// 挨拶の表示
	void showHello() {
		System.out.println(name + "さん、こんにちは。");
	}
}
```

```java:GoodMorning.java
package Test1;
public class GoodMorning extends Hello {
	// コンストラクタ
	public GoodMorning(String name) {
		super(name);
	}

	// 挨拶の表示
	void showGoodMorning() {
		System.out.println(name + "さん、おはようございます。");
	}
}
```

```java:GoodEvening.java
package Test1;
public class GoodEvening extends GoodMorning {
	// コンストラクタ
	public GoodEvening(String name) {
		super(name);
	}

	// 挨拶の表示
	void showGoodEvening() {
		System.out.println(name + "さん、こんばんは。");
	}
}
```

上記の文をコピーして、文字コードは `S-JIS` を指定し、ファイル名を `Test1.java` , `Hello.java` , `GoodMorning.java` , `GoodEvening.java` で保存し、実行するとこうなります。↓↓　　
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/cb33aa2d-af32-f454-bfd5-c8072aa5c7ca.png)


### 注意点
- `アップキャスト後` の実態は `サブクラスの縮小` なため、スーパークラスに同じメソッドが存在する場合は `サブクラスが優先` される。

```java:Test1.java
package Test1;
public class Test1 {
    public static void main(String[] args) {
        // インスタンスの生成
        TestB b = new TestB();
        b.view();// Bが表示される

        // アップキャスト
        TestA a = (TestA) b;
        a.view();// Bが表示される
    }
}
class TestA {
    public void view() {
        // スーパークラスの表示
        System.out.println("A");
    }
}
class TestB extends TestA{
    public void view() {
        // サブクラスの表示
        System.out.println("B");
    }
}
```

上記の文をコピーして、文字コードは `S-JIS` を指定し、ファイル名を `Test1.java` で保存し、実行するとこうなります。↓↓　　
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/e768482d-5467-6c5e-c20a-f835204d6df3.png)

## 6.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%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%8F%82%E7%85%A7%E5%9E%8B%E3%81%AE%E5%9E%8B%E5%A4%89%E6%8F%9B


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