我们可以通过接口实现一切,例如,它解决了我们多重继承的主要问题,我们可以实现100%的抽象。那么需要使用抽象类
参见我已经读过,抽象类可以被密切相关的类扩展和使用,例如:Circle Extends Shape等。
我还读到一个接口可以用来为类添加一个功能,比如implements Comparable,Runnable,Serializable等。
因为我们可以使用接口(甚至是抽象类可以做的事情)来做所有事情,那么抽象类的需求是什么。
另外抽象类中非抽象方法的用途是什么。
答案 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";}
}
但有时候,最好不要提供对象状态的访问权限,因此抽象类可能在某些情况下更合适。