ねっとぱんだ-プログラミング勉強ブログ-

Webデザイン、プログラミングの勉強ブログ。

【java】抽象クラス、インターフェースと継承とか

抽象クラス

参考
http://promamo.com/?p=481
http://www.booran.com/menu/java/interface.html
  • 継承させるためのクラス。
  • インスタンスを生成することはできない。
  • 継承するクラスを具象クラスと言う。
  • 継承したサブクラスでは抽象メソッドをオーバーライドしなければならない。
  • javaでは多重継承(一度に複数個を継承)することは出来ない。
//抽象クラス
abstract class AbstractHuman{
    //メソッドにもabstractを入れることで継承を強制する。
    public abstract void SayHi();//抽象メソッド
}
//具象クラス(AbstractHumanクラスを継承)
class ConcreateHuman extends AbstractHuman {
    @Override
	public void SayHi(){
    	System.out.println("hi");
    }
}

インターフェース

  • クラスの機能を拡張。
  • 定数、抽象メソッド、defaultメソッド(java8)、staicメソッド(java8)を記述できる。
  • どの継承ツリーのクラスにも実装できる。
  • 実装クラスはすべてのインターフェースメソッドを実装し、publicにしなければいけない。
  • インタフェース内のメソッドは必ず、抽象クラス。
    abstractは省略できる。
  • インタフェース内の変数は、publicかつfinalかつstatic すべて省略できる。

implements,名前,名前…
で多重継承できるhttp://java-code.jp/108

defaultメソッドを使うとinterfaceに実装を記述できる
その場合、複数interfaceに同じ名前のメソッドを作っていると、多重継承して呼び出した段階でコンパイルエラーになる。

interface Printable {
	//インターフェイスはクラスに幾つでも適応させられる。 
	//定数
	double VERSION = 1.2;
	//抽象メソッド
	void print();
	//defaultメソッド
	public default void getInfo(){
		System.out.println("I/F ver." + Printable.VERSION);
	}
	//staticメソッド
	
}
class Human implements Printable{
	@Override
	public void print(){
		System.out.println("printing...");
	}
}

クラスの継承とインターフェイスの違い

https://teratail.com/questions/69988
http://qiita.com/chkkchy/items/643eed88f59bd2b44d71

  • インターフェースは「何を使うか」のような規約の定義のようなもの(実装は含まれない)
  • クラスの継承は実装を提供する。

抽象クラスと派生クラスの継承の関係はIS A関係とよばれ
インターフェイスと実装クラスの「実装」の関係はCAN DO関係と呼ばれている

抽象クラスA は 派生クラスB
インターフェースA のできることは 実装クラスB

みたいな意味合いでしょうか?

多重継承について

「何故Javaでは多重継承は許されていないのか」
https://ja.stackoverflow.com/questions/25461/%E4%BD%95%E6%95%85java%E3%81%A7%E3%81%AF%E5%A4%9A%E9%87%8D%E7%B6%99%E6%89%BF%E3%81%AF%E8%A8%B1%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B/26462

同名メソッドを複数の親から継承した場合、順位づけの処理が必要な為複雑になる。
継承の経路が理解しにくくなる。