如果我们有接口,为什么要使用抽象

时间:2017-07-19 20:05:47

标签: java oop

我们可以通过接口实现一切,例如,它解决了我们多重继承的主要问题,我们可以实现100%的抽象。那么需要使用抽象类

参见我已经读过,抽象类可以被密切相关的类扩展和使用,例如:Circle Extends Shape等。

我还读到一个接口可以用来为类添加一个功能,比如implements Comparable,Runnable,Serializable等。

因为我们可以使用接口(甚至是抽象类可以做的事情)来做所有事情,那么抽象类的需求是什么。

另外抽象类中非抽象方法的用途是什么。

2 个答案:

答案 0 :(得分:0)

我认为有很多重复的问题,我发现this。 来自e-satisf的一些引用:

抽象类与接口不同,是类。它们使用起来更昂贵,因为当你从它们继承时有一个查找。 抽象类看起来很像接口,但它们还有更多东西:您可以为它们定义行为。它更多的是关于一个人说,"这些类应该看起来像这样,并且他们有共同点,所以填补空白!"。

简而言之,差异是interface,而abstract class是不同的抽象层次。 interface更抽象,因为它只定义了C中必须实现的函数签名方法。但是,abstract class将进一步定义函数的行为。此外,您可以在abstract class中定义字段,而在interface中则无法定义。

答案 1 :(得分:0)

Abstract class允许您定义字段,以便轻松实现一些有状态基础实现。

在Java 8之前,接口中没有默认方法,因此提供默认方法实现的唯一方法是创建抽象类。

从Java 8开始,您可以在接口默认方法静态方法中定义,但仍然没有字段。

  

抽象类

中非抽象方法的用途是什么?

未标记为抽象的方法可用作标准类中的标准方法。你有非抽象和抽象方法的原因是,某些类功能(某些方法)可能依赖于抽象方法。这是一个例子:

public class AbstractGreeting {
    private final String name;
    protected AbstractGreeting(String name) {this.name = name;}
    public void displayGreeting() {System.out.println(getGreeting() + " " + name + "!");}        
    protected abstract String getGreeting();
}

一些具体的实施:

public class HelloGreeting extends AbstractGreeting {
    public HelloGreeting(String name) { super(name);}
    @Override protected String getGreeting() { return "Hello"; }
}

public class AlohaGreeting extends AbstractGreeting {
    public AlohaGreeting (String name) { super(name);}
    @Override protected String getGreeting() { return "Aloha"; }
}

用法:

HelloGreeting hg = new HelloGreeting("World"); hg.displayGreeting();
AlohaGreeting ag= new AlohaGreeting ("World"); hg.displayGreeting();

当你强制执行器返回对象的状态时,可以将抽象类转换为接口。例如,上面的抽象类可以重写为:

public interface Greeting {
    String getName();
    String getGreeting();
    default void displayGreeting() {System.out.println(getGreeting() + " " + name + "!");}
}

实现:

public class HelloGreeting implements Greeting {
     @Override public String getName() {return "World";}
     @Override public String getGreeting() {return "Hello";}
}

但有时候,最好不要提供对象状态的访问权限,因此抽象类可能在某些情况下更合适。