継承とインターフェース

■継承

作成済みのクラスをもとにして新しいクラスを作成することを継承といいます。
継承元のクラスをスーパークラス、新しく作成されたクラスをサブクラスと呼びます。
	
●継承方法
	Javaのクラスで継承を行う場合、サブクラスの名前の後ろに
	extendsキーワードをつけて、その後ろにスーパークラスの名前を記述します。
	現在のJavaの仕様では関数のオーバーライドを行う際は@Overrideをつけて明示的に
	オーバーライド関数であることを示すことが推奨されています。

	継承例:
		class サブクラス名 extends スーパークラス名
		{
		}

	具体例:
		class Robot
		{
			protected String m_Name;
			
			public Robot() {}

			public Robot(String name)
			{
				m_Name = name;
			}

			public void SelfIntroduction()
			{
				System.out.println(m_Name);
			}
		}

		class RobotEx extends Robot
		{
			private float m_Weight = 0;
			private float m_Height = 0;

			public RobotEx(String name, float weight, float height)
			{
				m_Name = name;
				m_Weight = weight;
				m_Height = height;
			}
			
			@Override
			public void SelfIntroduction()
			{
				System.out.println(m_Name + "と言います。");
				System.out.println("体重は" + m_Weight + "kgです。");
				System.out.println("身長は" + m_Height + "cmです。");
			}
		}

		class Main 
		{
			public static void main(String[] args)
			{
				Robot robot_01 = new Robot("ロボット1号");
				RobotEx robot_02 = new RobotEx("ロボット2号", 100, 30);
				robot_01.SelfIntroduction();
				robot_02.SelfIntroduction();
			}
		}

■抽象クラス

抽象クラスとは継承を前提としたメソッドを持ったクラスのことです。
この継承を前提としたメソッドのことを抽象メソッドと呼びます。
抽象メソッドは抽象クラス内では定義をせず、継承先で定義を行います。
抽象クラスを作成する場合、クラス名の前にabstractキーワードを設定します。
継承先で定義を行わなかった場合、エラーになるので、
継承を通して共通のメソッドを定義したい場合に使用します。

	抽象クラスの特性:
		・クラスのスーパークラスとして使える
		・抽象クラス自体はインスタンス化できない
		・抽象メソッドは継承先で定義しないとエラーになる

	抽象クラスの書式
		abstract class クラス名
		{
		}

	抽象メソッドの書式
		[修飾子] abstract 戻り値の型 メソッド名(引数情報);

		※修飾子でprivateは使用することはできません。

	具体例:
		// 抽象クラス
		abstract class Robot
		{
			protected String m_Name;
			protected float m_Weight = 0;
			protected float m_Height = 0;

			public Robot()
			{
			}

			// 抽象メソッド
			public abstract void SelfIntroduction();
		}

		class RobotEx extends Robot
		{
			public RobotEx(String name, float weight, float height)
			{
				m_Name = name;
				m_Weight = weight;
				m_Height = height;
			}


			public void SelfIntroduction()
			{
				System.out.println(m_Name + "と言います。");
				System.out.println("体重は" + m_Weight + "kgです。");
				System.out.println("身長は" + m_Height + "cmです。");
			}
		}

		class Main 
		{
			public static void main(String args[])
			{
				RobotEx robot = new RobotEx("ロボット2号", 100, 30);
				
				robot.SelfIntroduction();
			}
		}

■インターフェース

インターフェースは抽象メソッドと定数のみで構成されたクラスのことです。
抽象メソッドと定数のみで構成されるので具体的なコードを一切含みません。
インターフェースは「class」の部分をinterfaceに置き換えて作成します。
インターフェースをクラスに実装する場合はクラス名の後に
「implements インターフェース名」をつけて使用します。
	
	インターフェースの特性:
		・宣言したメソッドはpublicの抽象メソッドとして扱われる
		・宣言した変数はstatic public finalの定数として扱われる
		・インターフェース自体をインスタンス化することは可能

	インターフェース書式:
		①インターフェースの通常の書式
			interface インターフェース名
			{
				メンバ変数;
				抽象メソッド();
			}

		②実質的な宣言の内容
			interface インターフェース名
			{
				public static final メンバ変数;
				public abstract 抽象メソッド();
			}

	インターフェース具体例:
		// インターフェース
		interface GameObjBase
		{
			void Init();
			void Run();
			void Delete();
		}

		// インターフェースを実装したクラス
		class CharaBase implements GameObjBase
		{
			public void Init() {}

			public void Run() {}

			public void Delete() {}
		}

		class Main 
		{
			public static void main(String[] args)
			{
				CharaBase ch = new CharaBase();

				ch.Init();
				ch.Run();
				ch.Delete();
			}
		}

■多重継承

Javaのクラスの継承はC++とは違い1つしか継承できません。
Javaで多重継承を実装する場合はインターフェースを使用します。
インターフェースは複数継承することが可能です。

多重定義の書式:
	class クラス名 extends スーパークラス名 
			implements インターフェース名1, インターフェース名2
	{
	}