抽象クラスとインタフェースの違いを理解しよう!


抽象クラスとインタフェースの違いを理解しよう!

きっと良く使う奴らが、いざ使おうとすれば、忘れてしまって困る時がある。
今回は、抽象クラスとインタフェースの違いを理解しましょう。

抽象クラス???

まず、抽象クラス(abstract class)は何ものから始めます。
抽象クラスは、簡単に言うと、【未完成のクラス】です。
→ 【未完成のMethod】を持っています。

抽象クラスは、
一人では、Classの役割を果たしませんが、
新しいClassを作成するため、Basic Classとなる親クラス(Super Class)として重要な意味を持っています。

一つの例を、準備しました。
図形の広さは求める例です。
Shapeという抽象クラスは、【図形の広さを求める】という抽象的な機能のみを定義します。
以後、サブクラスはどのように実装するかを定義します。

abstract class Shape {         
   abstract void draw(double a, double b);
}
class Circle extends Shape {
   void draw(double r1, double r2) {
      System.out.println("Circle : " + (3.14 * r1 * r2));
}
class Rectangle extends Shape {
   void draw(double h, double v) {
      System.out.println("Rectangle  : " + (h * v));
}
class Triangle extends Shape {
   void draw(double a, double h) {
      System.out.println("Triangle  : " + (a * h / 2));
}
public class AbstractTest 
{
   public static void main(String args[]) {
      Circle c = new Circle();
      c.draw(5.0, 5.0);

      Rectangle r = new Rectangle();
      r.draw(5.0, 10.0); 

      Triangle t = new Triangle();
      t.draw(5.0, 10.0);  

      Shape s = new Circle();
      s.draw(5.0, 5.0);  
   }
}

インタフェース???

インタフェースは、抽象クラスの友達です。
一種の抽象クラスですが、抽象クラスよりもっと抽象的です。
クラスでインタフェースを使用するためにimplementsを使います。

また、面倒くさいですが、インタフェースには色んな制約があります。
- すべてのメンバ変数は、public static finalでなければならない。(省略できる)
- すべてのメソッドは、public abstractでなければならない。(省略できる)

TV.java
public interface TV{
   public int MAX_VOLUME = 100;
   public int MIN_VOLUME = 0;

   public void turnOn();
   public void turnOff();
   public void changeVolume(int volume);
   public void changeChannel(int channel);
}

TV.javaを作りました。
抽象メソッドと定数を定義することができます。

LedTV.java
public class LedTV implements TV
{
    public void on(){
        System.out.println("TV ON");
    }
    public void off(){
        System.out.println("TV OFF");   
    }
    public void volume(int value){
        System.out.println(value + "volume Setting.");  
    }
    public void channel(int number){
        System.out.println(number + "channel Setting.");         
    }
}
Test.java
public class Test{
    public static void main(String args[]){
        TV tv = new LedTV();
        tv.on();
        tv.volume(50);
        tv.channel(6);
        tv.off();
    }
}

もしTVインタフェースを実装するLcdTVを作成した場合には、
new LedTV部分だけnew LcdTVに変更しても、同じようにプログラムが動作できます。

抽象クラスとインタフェースの共通点

  • 抽象クラスとインタフェースは、宣言だけあって実装内容がない。
  • 自分自身がnewを使用してオブジェクトを生成することができず、継承された子だけがオブジェクトを生成することができる。
  • 継承されたクラスが実装を必ずするようにすべきときに使用する。

抽象クラスとインタフェースの違い

インタフェース 抽象クラス
実装オブジェクトに同じ動作を保証するため 機能を利用して、拡張させるため
多重継承が可能 多重継承は不可能
抽象メソッドのみ可能 一般メソッド+抽象メソッド可能