如果我们可以简单地覆盖超类的方法或使用抽象类,为什么我们应该使用接口?

Sid*_*ril 4 java inheritance abstract-class overriding interface

我有两个程序,一个使用接口实现,另一个只使用类实现 - 我读过使用接口的优点是它可以提供它自己的超类方法的实现,但可以使用抽象类或方法完成压倒一切的.接口有什么用途?
在什么样的层次结构和使用界面的情况下最有利?

接口

interface Shape
{
    void area(int x, int y);
}
class Rectangle implements Shape
{
    @Override
    public void area(int length, int breadth)
    {
        System.out.println(length*breadth);
    }
}
class Triangle implements Shape
{
    @Override
    public void area(int base, int height)
    {
        System.out.println(base*height);
    }
}
public class ShapeUsingInterface
{
    public static void main(String X[])
    {
        Rectangle r = new Rectangle();
        Triangle t  = new Triangle();

        r.area(5, 4);
        t.area(6, 3);
    }
}
Run Code Online (Sandbox Code Playgroud)



class Shape
{
    void Area(int x, int y)
    {
        System.out.println(x*y);
    }
}
class Rectangle extends Shape
{

}
class Triangle extends Shape
{
    @Override
    void Area(int base, int height)
    {
        System.out.println((0.5)*base*height);
    }
}
public class CalculateArea 
{
    public static void main(String X[])
    {
        Rectangle r = new Rectangle();
        Triangle t = new Triangle();

        r.Area(4, 5);
        t.Area(6, 8);
    }
}
Run Code Online (Sandbox Code Playgroud)

chr*_*her 9

要解释为什么使用接口,您必须首先了解继承问题.它被称为钻石问题.简单地说,如果一个类,D从两个类继承BC,并BC来自同一个类继承两者A,其中执行从方法A确实D得到什么?

在此输入图像描述

我们留下的是Java不喜欢的方法歧义!因此,防止这种方式是确保D永远只能有一个超类,所以它可以从任何继承A,B或者C,但从来没有超过一个.这样可以防止出现问题,但是我们失去了多重继承提供的所有优惠!

进入界面.这允许我们具有多重继承的特权(将单个类引用为各种不同的类型)并且仍然避免钻石问题,因为实现类提供了该方法.这消除了方法歧义.

这意味着,例如:

public abstract class MyClass {
    public void doSomething();
}

public class MyConcreteClass extends MyClass {
    public void doSomething() {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以引用MyConcreteClassas 的实例

 MyClass class = new MyConcreteClass();
Run Code Online (Sandbox Code Playgroud)

要么

 MyConcreteClass class = new MyConcreteClass();
Run Code Online (Sandbox Code Playgroud)

但鉴于此实施,绝不是别的.你不能有extend更多的课程,因为你可能会得到钻石问题,但你可以包括一个Interface

public class MyConcreteClass extends MyClass implements Serializable {
}
Run Code Online (Sandbox Code Playgroud)

突然之间,你可以说......

Seralizable myClass = new MyConcreteClass();
Run Code Online (Sandbox Code Playgroud)

因为myClass Serializable.当一个方法可能不需要知道它是一个实例时MyConcreteClass,这对于将类彼此解耦是非常好的,只是它有一个必要的方法子集.

简而言之:您可以实现许多接口,但是您只能继承一个类.