初心者によるオブジェクト指向まとめ (Java)

#はじめに
研修で学んだオブジェクト指向について、自分用のメモのつもりで書きました。
詰まったり調べたりした内容を自分なりに咀嚼してまとめています。

#内容
・クラス
・インスタンス
・メンバ変数
・メソッド
・コンストラクタ
・クラス変数(static変数)
・継承
・オーバーライド

#ざっくり説明
・クラス：ひな型、テンプレート（ex. 人間）
・インスタンス：クラスをもとにつくられた実体（ex. Aさん、Bさん、… ）

・メンバ変数：インスタンスの属性（ex. 体力、知力、年齢）
・メソッド：インスタンスのできる動作（ex. 歩く、挨拶する）
・コンストラクタ：メンバ変数の初期設定

・クラス変数(static変数)：クラスの属性（Aさんのデータを書き換えるとAさんのデータもBさんのデータも同じように変更される）

・継承：クラスを派生させたとき、もとのクラス(スーパークラス)の機能も使える仕組み
・オーバーライド：クラスを継承するときに、スーパークラスのメソッド(処理)を、サブクラスにおいて再定義(上書き)すること

#例

下の方に、クラス・インスタンス・継承などの関係がわかるようなコードを書いたので、照らし合わせながら説明を読んでみてください。

###クラスとインスタンス
人間のひな型を作ったあと、人間の特徴を持った日本人というひな型を作成し、
それをもとに、太郎さんというひとりの人を生成しています。

このとき、人間がスーパークラス、日本人がサブクラス、太郎さんがインスタンスです。

###メンバ変数
メンバ変数は、インスタンスの持つステータスです。
今回、人間は、体力・知力・言語というステータスを持つことにします。

###コンストラクタ
メンバ変数の初期設定です。
今回の場合、人間の体力と知力は引数で設定することにし、言語は初期値ではnullにしています。

また、日本人は日本語が母国語なので、Japaneseクラス(日本人のテンプレート)で言語を日本語に設定しています。

###メソッド
人間がみんなできる動作として、歩く、挨拶する、という2つの動作を設定しています。

また、日本人特有の動作として、おじぎする、という動作をJapaneseクラスで設定しました。

さらに、挨拶は人間が共通して行う動作ですが、そのアウトプットの形は
日本人なら「こんにちは」、中国人なら「ニーハオ」などと異なります。
そのため、Japaneseクラスでgreetメソッドをオーバーロードし、「こんにちは」と挨拶するようにしています。

================

```Java:Human.java
// クラス（人間のテンプレート）
public class Human{

	// メンバ変数（インスタンスの属性）
	int pysicalPower; // 体力
	int intellectualPower; // 知力
	String langage; // 言語

	// クラス変数（static変数）
	static int magicPower = 0;  // staticなので、人間はみんな魔力0。誰かの魔力を10にすると、他の人もみんな魔力10になる。

	// コンストラクタ（メンバ変数の初期設定）
	public Human(int pysical, int intelligence) {
		this.pysicalPower = pysical;
		this.intellectualPower = intelligence;
		this.langage = null;
	}

	// メソッド（動作）
	public void walk() {  // 歩く
		System.out.println("テクテク");
	}
	public void greet() {  // 挨拶する
		System.out.println("Hello");
	}

	// 設定確認メソッド
	public int getPysicalPower() {
		return pysicalPower;
	}
	public int getIntellectualPower() {
		return intellectualPower;
	}
	public String getLangage() {
		return langage;
	}
}

```

```Java:Japanese.java
// クラス（日本人のテンプレート）
public class Japanese extends Human { //Humanクラスを継承したサブクラス

	// コンストラクタ
	Japanese(int pysical, int intelligence) {
		super(pysical, intelligence); // 親コンストラクタの呼び出し
		super.langage = "日本語";
	}

	// メソッド
	public void ojigi() {  // おじぎする
		System.out.println("ペコリ");
	}

	// オーバーライド
	@Override
	public void greet() {
		System.out.println("こんにちは");
	}
}

```

```Java:Main.java
public class Main {

	public static void main(String[] args) {

		// インスタンス（テンプレートをもとにした個人）を生成
		Japanese Taro = new Japanese(50, 30);  /* 日本人の 太郎(体力50、知力30) を生成 */

		// 太郎のステータスを確認
		System.out.println("太郎の体力は " + Taro.getPysicalPower());
		System.out.println("太郎の知力は " + Taro.getIntellectualPower());
		System.out.println("太郎の使用言語は " + Taro.getLangage());
		System.out.println(); // 空行


		// メソッド（動作）を呼び出す
		Taro.walk(); // Humanクラスのメソッド

		Taro.ojigi(); // Japaneseクラスのメソッド

		Taro.greet(); // Japaneseクラスでオーバーライドしたメソッド

	}

}

```

```:実行結果
太郎の体力は 50
太郎の知力は 30
太郎の使用言語は 日本語

テクテク
ペコリ
こんにちは
```
#おわりに
実際にオブジェクト指向をつかうコードを自分で考えて書いてみると、少し理解が深まりました。
理解が浅くうまく説明できなかった部分や、複雑にならないよう盛り込まなかった内容もあるので、学習が進んだら第二弾を書くのもありかなと思っています。（気が向けば、、）

#参考
学習する際に参考にしたサイト

- [初心者向けに徹底解説！オブジェクト指向とは？](https://eng-entrance.com/what-oop)（特に「勇者に学ぶオブジェクト指向プログラミング」の部分を一度写経してみたらかなり理解が進みました）
- [メンバ変数とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13563.html)