LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

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

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

抽象クラス???

まず、抽象クラス(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を使用してオブジェクトを生成することができず、継承された子だけがオブジェクトを生成することができる。
  • 継承されたクラスが実装を必ずするようにすべきときに使用する。

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0