抽象クラスとインタフェースのプログラム問題の練習


目次
  • 抽象クラスとインタフェースの異同
  • 抽象クラスのプログラム問題
  • プログラムコード
  • インタフェースのプログラム問題
  • プログラムコード
  • 抽象クラスとインタフェースの異同
  • 同じ点:
  • はいずれも
  • をインスタンス化することはできない.
  • には継承メカニズムがある.すなわち、抽象クラスはクラスを継承することができ、インタフェースはインタフェース
  • を継承することができる.
  • は、抽象メソッド(メソッド宣言)
  • を持つことができる.
  • 非抽象クラスは、extendsまたはimplementsによって両方を使用する場合に、それらの抽象メソッドを書き換える必要があります.
  • はいずれも多態性
  • を実現することができる.
  • 異なる点:
  • 抽象クラスは方法を実現することができる.インタフェースはメソッドを実装できず、宣言するしかありません.
  • 抽象クラスにはメンバー変数があり、インタフェースは静的メンバー定数しか持たない.
  • 抽象クラスのメソッドは抽象メソッドではなく、インタフェースのメソッドは抽象メソッド(java 8以降、インタフェースにデフォルトメソッドと静的メソッドが追加される)のみです.
  • デフォルト修飾子は異なります.抽象クラスでは、抽象メソッドのデフォルトのアクセス修飾子はprotectedです.インタフェースでは、メソッドの修飾子がデフォルトでpublic abstractに強制され、プロパティの修飾子がデフォルトでpublic static finalに強制されます.
  • 使用または実装の方法は異なります.抽象クラスはextends継承によって抽象メソッドを実装し、書き換えます.インタフェースはimplements実装によって抽象メソッドを書き換える.
  • で同時に使用できる数は異なります.1つのクラスは最大1つの抽象クラスしか継承できません.1つのクラスで複数のインタフェースを同時に実現できます.
  • 同時に継承できる数は異なります.抽象クラスは最大1つの親しか継承できません.インタフェースは、複数のインタフェースを同時に継承できます.


  • 抽象クラスのプログラム問題
  • 1、グラフィックソフトでは、大きさや色の異なる円形、矩形などのジオメトリを描くことができます.ジオメトリの間には、ある色で描くことができ、塗りつぶすことができるか、塗りつぶさないことができるなど、共通の特徴がたくさんあります.また、円形には半径があり、半径に基づいて円形の面積と周長を計算することができ、矩形には幅と高さがあり、幅の高さに基づいて矩形の面積と周長を計算することができるなど、異なる特徴もあります.1、Javaプログラムを作成する.(1)継承メカニズムを用いて、抽象ベースクラスの図形クラス、派生クラスの円形クラス、正方形クラス、長方形クラスをそれぞれ設計し、要求:1抽象図形クラスに属性ブラシの色があり、図形が充填されているかどうか、図形面積を取得し、図形周長を取得する方法がある.②構成方法を用いてそのメンバー属性に初期値を付与する.③派生クラスごとにtoString()メソッドを書き換え、すべての属性の情報を返す.④合理的な設計クラスの他のメンバーの属性と方法を文字に基づいて説明する.(2)設計は画板類を実現し、要求:1赤色、充填なし、長さと幅がそれぞれ10.0と5.0の長方形を描く.②緑、塗りつぶし、半径3.0の円形を描く.③黄色、塗りつぶしなし、辺長4.0の正方形を描く.④3つのオブジェクトの面積と周長をそれぞれ求め、各オブジェクトのすべての属性情報をコンソールに印刷します.
  • プログラムコード
  • Figure.java
    package com.exercise1;
    
    /**
     * 

    Description:

    * @author HiTMT * @date 2019 9 25 2:38:50 */
    public abstract class Figure { protected String penColor; // protected boolean isFill; // public Figure(String penColor, boolean isFill) { this.penColor = penColor; this.isFill = isFill; } public abstract double getArea(); // public abstract double getPerimeter(); // public abstract String toString(); public String getPenColor() { return penColor; } public void setPenColor(String penColor) { this.penColor = penColor; } public boolean isFill() { return isFill; } public void setFill(boolean isFill) { this.isFill = isFill; } }

    Circle.java
    package com.exercise1;
    /**
     * 

    Description:

    * @author HiTMT * @date 2019 9 25 2:39:01 */
    public class Circle extends Figure { private double radius; // public Circle(String penColor, boolean isFill, double radius) { super(penColor, isFill); this.radius=radius; } public double getArea() { return Math.PI*radius*radius; } public double getPerimeter() { return 2*Math.PI*radius; } public String toString() { return "Circle [radius=" + radius + ", penColor=" + penColor + ", isFill=" + isFill + "]"; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } }

    Square.java
    package com.exercise1;
    /**
     * 

    Description:

    * @author HiTMT * @date 2019 9 25 2:39:19 */
    public class Square extends Figure { private double side; // public Square(String penColor, boolean isFill, double side) { super(penColor, isFill); this.side=side; } public double getArea() { return side*side; } public double getPerimeter() { return 4*side; } public String toString() { return "Square [side=" + side + ", penColor=" + penColor + ", isFill=" + isFill + "]"; } public double getSide() { return side; } public void setSide(double side) { this.side = side; } }

    Rectangle.java
    package com.exercise1;
    /**
     * 

    Description:

    * @author HiTMT * @date 2019 9 25 9:59:27 */
    public class Rectangle extends Figure { private double side1; // 1 private double side2; // 2 public Rectangle(String penColor, boolean isFill, double side1, double side2) { super(penColor, isFill); this.side1=side1; this.side2=side2; } public double getArea() { return side1*side2; } public double getPerimeter() { return (side1+side2)*2; } public String toString() { return "Rectangle [side1=" + side1 + ", side2=" + side2 + ", penColor=" + penColor + ", isFill=" + isFill + "]"; } }

    DrawingBoard.java
    package com.exercise1;
    /**
     * 

    Description:

    * @author HiTMT * @date 2019 9 25 9:59:43 */
    public class DrawingBoard { public static void main(String[] args) { Rectangle rectangle=new Rectangle("red", false, 10, 5); Circle circle=new Circle("grean", true, 3); Square square=new Square("yellow", false, 4); System.out.println(" : ="+rectangle.getArea()+"; ="+rectangle.getPerimeter()+";"+rectangle); System.out.println(" : ="+circle.getArea()+"; ="+circle.getPerimeter()+";"+circle); System.out.println(" : ="+square.getArea()+"; ="+square.getPerimeter()+";"+square); } }

    インタフェースのプログラム問題
  • 2、上题の背景に基づいて、设计は以下のプログラムを実现します:(1)Comparableインタフェースを设计して、インタフェースの中でcompareTo()方法を设计して、対象を比较します.このメソッドの戻り値タイプはintタイプとして設計されています.このメソッドは、グラフィッククラスのパラメータを受信します.(2)2つのパターンの面積の大きさを比較するためのグラフィッククラスにおけるcompareTo()メソッドを実装する.(3)テストクラスでグラフィッククラスの配列を作成し,配列に複数の円形,正方形,長方形のオブジェクトを格納し,compareTo()メソッドを用いて配列の中で面積が最も大きい図形を探し出す.ヒント:オブジェクトを比較する場合、compareTo()メソッドの戻り値を1、0、-1に設定して、比較結果を表すことができます.現在のオブジェクトが大きく、両者が等しいか、現在のオブジェクトが小さいです.もう一度注意して、この問題に関連するコードはすべてこの問題の問題番号の下に表示され、前の問題とは独立しています.
  • プログラムコード
  • 補足修正後のFigure.java
    package com.exercise1;
    
    import com.exercise2.Comparable;
    
    /**
     * 

    Description:

    * @author HiTMT * @date 2019 9 25 2:38:50 */
    public abstract class Figure implements Comparable { protected String penColor; // protected boolean isFill; // public Figure(String penColor, boolean isFill) { this.penColor = penColor; this.isFill = isFill; } public abstract double getArea(); // public abstract double getPerimeter(); // public abstract String toString(); public String getPenColor() { return penColor; } public void setPenColor(String penColor) { this.penColor = penColor; } public boolean isFill() { return isFill; } public void setFill(boolean isFill) { this.isFill = isFill; } public int compareTo(Figure fig) { double d=getArea()-fig.getArea(); if(d>0) { return 1; }else if(d==0) { return 0; }else { return -1; } } }

    Comparable.java
    package com.exercise2;
    
    import com.exercise1.Figure;
    
    /**
     * 
     * 

    Description:

    * @author HiTMT * @date 2019 9 25 3:09:46 */
    public interface Comparable { /** * * @param fig * @return 1: fig ;0: ;-1 fig */ int compareTo(Figure fig); }

    Tester.java
    package com.exercise2;
    
    import com.exercise1.Circle;
    import com.exercise1.Figure;
    import com.exercise1.Rectangle;
    import com.exercise1.Square;
    
    /**
     * 

    Description: Comparable

    * @author HiTMT * @date 2019 9 25 3:09:46 */
    public class Tester { /** * * @param figArr * @return */ public static Figure getMax(Figure[] figArr) { Figure maxF=figArr[0]; for(int i=1;i<figArr.length;i++) { if(figArr[i].compareTo(maxF)>0) { maxF=figArr[i]; } } return maxF; } /** * * @param size * @return */ public static Figure[] createTestDate(int size) { Figure[] figArr=new Figure[size]; for(int i=0;i<size;i++) { int typeNum=(int)(Math.random()*3); String ts="00000"+Integer.toHexString((int)(Math.random()*Math.pow(16, 6))); String color="#"+ts.substring(ts.length()-6); boolean isFill=Math.random()>=0.5?true:false; double d1=Math.random()*size; double d2=Math.random()*size; switch(typeNum) { case 0: figArr[i]=new Circle(color, isFill, d1); break; case 1: figArr[i]=new Rectangle(color, isFill, d1, d2); break; case 2: figArr[i]=new Square(color, isFill, d1); break; default: break; } } return figArr; } public static void main(String[] agrs) { Figure[] figArr=createTestDate(100); System.out.println(getMax(figArr)); } }