CodeGym /Java Blog /ランダム /Java 抽象メソッドとクラス
John Squirrels
レベル 41
San Francisco

Java 抽象メソッドとクラス

ランダム グループに公開済み
抽象メソッドは Java の強力なツールであり、このオブジェクト指向言語にポリモーフィズムに関してさらに多くの機能を提供します。Java 抽象メソッドを使用すると、プログラム全体の基本フレームワークを作成し、必要に応じて調整できます。Java 抽象メソッドとあなた - 1

抽象メソッドとは何ですか?

抽象メソッドとは、実装を持たないメソッドです。つまり、宣言があるだけなので、名前、戻り値の型、および受け入れる変数がわかっています。基本的な抽象メソッドの例を次に示します。

public abstract int example(int a1, int a2);
このメソッドを見ると、整数を返し、引数として 2 つの整数を受け入れることがわかります。このメソッドがどのように実装されるかはわかりません。これを実装するにはオーバーライドする必要があるためです。Java で抽象メソッドを作成する場合は、いくつかのガイドラインに従う必要があります。そうしないと、プログラムが正しくコンパイルされません。覚えて:
  • Java 抽象メソッドには実装がありません。つまり、メソッドの後に中括弧やメソッドの使用方法を示す本文を決して続けないでください。セミコロンで終わっているだけです。

  • 抽象メソッドを作成した場合、それは抽象クラスにのみ配置できます。つまり、内部に抽象メソッドを含む具象クラスを作成することはできません。
    私。余談ですが、抽象クラスがある場合は、コンストラクターを含めることができます。ただし、抽象メソッドを使用する必要はありません。

  • 具象クラスが抽象クラスを拡張する場合、親クラスのすべての抽象メソッドも実装する必要があります。そうしないと、具象クラスにすることができず、抽象として宣言する必要があります。

最後の 2 つは少しわかりにくいかもしれないので、すぐに説明しましょう。

抽象 Java クラスの拡張

周囲長と面積を返す基本的な形状に関するプログラムを書きたいとします。そこで、親抽象クラスを作成します。ただし、すべての形状には独自のルールがあるため、それぞれを異なる方法で計算する必要があるため、抽象Shapeクラスを次のように 作成します。

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
これらの抽象メソッドを実際に使用したい場合は、Java の抽象親クラスShapeを拡張してから、メソッドをインスタンス化する 必要があります。したがって、各具象クラスはエリアおよび境界の抽象メソッドを実装する必要があります。

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
コンソールからの出力は次のようになります。

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Quadriliteral クラスは、親クラスShapeからShape(String name)コンストラクターをインスタンス化する必要がないことに注意してください。それは抽象メソッドではないからです。ただし、クラスに領域または境界のみを実装した場合は、両方が含まれていないため、新しいクラスは抽象クラスでなければなりません。インターフェイスで抽象メソッドを使用することもできます。

インターフェイスを備えた抽象 Java メソッド

インターフェイスとは何か、そしてそれが抽象クラスとどのように異なるのかを簡単に確認してみましょう。インターフェイス内で宣言された変数はすべて、public、static、final です。一方、抽象クラスには非最終変数のみがあります。インターフェイス内のすべてはデフォルトでパブリックです。抽象クラスには、プライベート、保護、パブリックなどを含めることができます。最後に、クラスはインターフェイスを拡張するのではなく、インターフェイスを実装します。JDK 8 より前では、インターフェイスには抽象メソッド以外のものを含めることはできませんでした。現在、インターフェイスにはデフォルト メソッドと静的メソッドを含めることができます。このため、ベスト プラクティスは、拡張可能なテンプレートとして抽象メソッドを使用することから離れ、インターフェイスとその実装に重点を置くようになりました。したがって、インターフェイスとしてShapeを作成し、それを四角形として実装するとします。、どんな感じになるでしょうか?まず、 Shape(String name)コンストラクターを廃止する必要があります。2 つの抽象メソッドだけを使用すると、次のようになります。

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
最後に、 Shapeインターフェイスを実装する 新しい四角形を使用する場合も、ほぼ同じになります。

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
コンソールの出力は次のようになります。

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
インターフェイスと抽象クラスの違いについて詳しく知りたい場合は、ここで詳細情報を見つけることができます。

しかし、なぜ抽象 Java メソッドを使用するのでしょうか?

Java で抽象メソッドが使用される理由、およびそれらの使用に慣れる必要がある理由は数多くあります。適切な場合にこれらを使用する必要がある 3 つの簡単な理由を次に示します。
  1. 作業の重複を避ける – コーディング例を振り返ってください。あなたとあなたのチームが長方形以外の図形のクラスを作成する必要があると想像してください。そのクラスを設計するために思いつくさまざまな方法が何通りありますか? 十?15?そしてそれは単純な問題です。もっと複雑なものを想像してみてください。あなたとあなたのチームは何百もの方法を思いつくことができます。そうなると、それらを統合して一貫したプログラムを作成するという困難な作業に直面することになります。これにより、次のポイントである実装の定義に進みます。

  2. Java の抽象メソッドを使用すると、使用と実装を定義できます。抽象クラスまたはインターフェイスを使用し、設計上、抽象メソッドを使用すると、他の人がそのインターフェイスと対話する方法を定義することになります。これにより、どの変数を使用する必要があるか、どのような戻り値の型が期待できるかを知ることができます。
    これらをオーバーライドして、独自の方法でインターフェイスを実装する具体的なクラスを作成することはできますが、コードの中心的な使用方法を決定することはできません。Shape を実装したい場合は、周囲と面積の両方をオーバーライドまたは実装する必要があります。

  3. 可読性とデバッグ – 抽象メソッドを使用すると、コードの可読性が向上します。インターフェイスを実装するクラスを作成するときは、何を探すべきかがわかります。インターフェイス内のすべての抽象メソッドが実装に含まれることがわかっているため、読みやすくなり、バグを追跡しやすくなります。抽象メソッドは、Java やその他のオブジェクト指向言語でポリモーフィズムを適切に使用する方法を学習するための始まりにすぎません。これらを理解し、使用し始めると、コーディングの旅のまったく新しい章が始まります。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION