抽象类vs接口,示例为

时间:2017-10-04 20:27:37

标签: java inheritance

所以我试图理解Abstract Class和Interfaces之间的区别。我知道这是一个很好的主题,但我写了一些代码,看看我是否可以更好地了解这个概念。请告诉我,如果我在正确的轨道上,我可以推断出差异。

我的理解是,当对象/类之间存在核心相似性时,我会使用抽象类。在我的例子中,我使用Quadrilaterals作为我的抽象类。这是一个4面的数字(以二维意义说话)。这意味着我可以通过扩展这个抽象类来创建Rectangle和Square对象,并利用抽象类的4面(?)。因此,这些类将继承该核心属性。因此,抽象类可能主要用于编写公共代码以反映这些核心属性。所以从本质上讲,我的抽象类DEFINES派生类(Rectangle和Square)。到目前为止?

当存在共性时使用接口,但区别在于接口与抽象类不同,不定义使用它的类。它只有抽象方法(在某种意义上是契约),如果接口是针对特定类实现的,则必须使用它们。这样做的目的是在某些类似的类中使用常用方法来突出显示这些类的类似功能。像所有形状的getArea()和getPerimeter()一样,无论是否为四边形。正确?

在我的例子中,我实现了方法getNumberofSidesForQuadrilaterals来返回Quadrilaterals的边数。这将始终返回4.我可以在界面中使用此方法,但它将毫无意义,因为这将导致我必须在我们已知的对象上调用方法是4面(对于每个创建的4面对象)好像是浪费时间。我对吗?关闭,离开?欢迎使用对象引用添加示例(以显示关系)。

package abstractex;

/**
 *
 * 
 */


 interface Shapes{     

    public double getPerimeter();
    public double getArea();

}

    public abstract class Quadrilaterals implements Shapes{

    double base,height; 
    double sides;


    public int getNumberofSidesForQuadrilaterals(){

        final int sides = 4;
        System.out.println(sides);
        return sides;
    }

 }

class Rectangle extends Quadrilaterals  {

    public Rectangle(double base, double height) {
        this.base = base;
        this.height = height;
    }

    @Override
    public double getPerimeter(){

        double r = 1;

        double perimeter = (2 * base) + (2 * height);

        System.out.println("The perimeter of the Rectangle is " + perimeter);

        return perimeter;
    }

    @Override
    public double getArea(){

        double area = base * height;

        System.out.println("The area of the Rectangle is " + area);


        return base * height;
    }

}  

 class Square extends Quadrilaterals {


    public Square(double base, double height) {
        this.base = base;
        this.height = height;
    }

    @Override
    public double getPerimeter(){

        double perimeter = base * 4;

        if (base == height)
        {
            System.out.println("The perimeter of the Square is " + perimeter);
        } else {
            System.out.println("The base and height of the square must be equal");
        }

        return perimeter;

     }   

    @Override
    public double getArea(){

        double area = base * base;

         if (base == height)
        {
            System.out.println("The area of the Square is " + area);
        } else {
            System.out.println("The base and height of the square must be equal");
        }

        return area;
    }

 }

class Circle implements Shapes{

    double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getPerimeter(){

        double perimeter = 2*radius*Math.PI;

        System.out.println("The perimeter of the Circle is " + perimeter);

        return perimeter;
    }

    @Override
    public double getArea(){

        double area =  Math.PI*radius*radius; 

        System.out.println("The area of the Circle is " + area);
        return area;
    }

    public static void main(String[] args) {

        Rectangle c = new Rectangle(5,2);
        c.getPerimeter();
        c.getArea();
        c.getNumberofSidesForQuadrilaterals();


        Square d = new Square(5,5);
        d.getPerimeter();
        d.getArea();
        d.getNumberofSidesForQuadrilaterals();


        Circle e = new Circle(5);
        e.getArea();
        e.getPerimeter();


    }

 } 

输出:

矩形的周长是14.0

矩形区域为10.0

4

Square的周长是20.0

广场的面积是25.0

4

Circle的面积是78.53981633974483

Circle的周长是31.41592653589793

1 个答案:

答案 0 :(得分:0)

这个问题可能有点不清楚,因为它在最后一段中有些隐藏。 除此之外,抽象类和接口之间在函数名称方面没有真正的区别。在类(和继承)中定义的函数集是接口。接口以与抽象类相同的方式定义契约。不同之处在于抽象类可以定义行为,而接口(可以*)则不行。 (*他们现在可以使用default)。类可以实现多个接口,但只扩展一个类。虽然getNumberOfSides()对于Shape界面来说是更好的选择,但getNumberofSidesForQuadlaterals()也可以适合某些界面。即使结果应该总是4,理论上你计算数字的方式也可以不同的方式实现,甚至可以用非形状类来实现。如果你要在Abstract类中定义它,那么后者是不可能的。

最后,归结为您将如何使用代码。如果你有5种不同的方法来计算a的边数 4面形状,然后界面可能是个好主意。否则,可能不会。

(另外,使用单数形式作为抽象类/接口的名称。Circle是 - Shape,而不是Shapes。对于Square,您应该只能指定一边的长度,而不是baseheight。否则你的方块实际上可能变成一个矩形。)