抽象类还是接口:JAVA?

Sar*_*ang 5 java

我有一个通用方法,我需要在多个类中使用它,只需从调用类中调用一次即可。所以我看到的是我可以用两种方式调用它。

public abstract class TestAbstractClass {
    void commonMethod(){
        System.out.println("Calling common method : TestAbstractClass");
    }
}
Run Code Online (Sandbox Code Playgroud)

调用类:

public class RunApplication extends TestAbstractClass{

    public void testMethod(){
        commonMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

[或者]

在界面中使用默认方法的 Java 8 特性。

public interface TestInterface {
    default void commonMethod(){
        System.out.println("Calling common method : TestInterface");
    }
}
Run Code Online (Sandbox Code Playgroud)

调用类:

public class RunApplication implements TestInterface{

    public void testMethod(){
        commonMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

它们对我来说都很好,但是更好的方法是使用非抽象方法的抽象类或具有默认方法的接口。

use*_*460 2

抽象类或接口

如果我是你,我会通过检查所有这些类是否相关来判断适当性。

一般来说,如果实现接口的类几乎没有关系或根本没有关系,并且它们恰好共享某些可以通过接口中的方法公开的行为,我将使用接口。

当类是其他类的子集时,我将使用抽象。

例子:

以鸟和飞机为例。鸟和飞机都会飞。但除此之外,他们根本没有任何关系。您自然会想要实现一个接口而不是使用抽象类,因为飞机都不是鸟,鸟也都不是飞机。

class Bird implements Flyable
{
    @Override
    public void fly(){

    }
}

class Plane implements Flyable
{
    @Override
    public void fly(){

    }
}
Run Code Online (Sandbox Code Playgroud)

另一个要考虑的问题是多重继承。在Java中,类的多重继承是不允许的。因此,如果您使用抽象,您的子类将无法扩展到另一个类。

如果您的类实现了一个接口,它总是可以实现另一个接口或扩展到另一个类。