Java接口和抽象类问题

Geo*_*ge2 7 java design-patterns interface class

我正在读这本书 - Hadoop:The Definitive Guide

在第2章(页25)中,提到"新API支持接口上的抽象类,因为它们更容易发展.例如,您可以在不破坏旧实现的情况下向抽象类添加方法(使用默认实现)班级".它意味着什么(特别是"破坏类的旧实现"的意思)?感谢是否有人可以向我展示一个示例为什么从这个角度来看抽象类比界面更好?

乔治,提前谢谢

Joe*_*oey 10

对于接口,接口中定义的所有方法必须由实现它的类实现.

给定接口A.

interface A {
    public void foo();
}
Run Code Online (Sandbox Code Playgroud)

和B级:

class B implements A {
}
Run Code Online (Sandbox Code Playgroud)

必须为接口中定义的方法提供实现:

class B implements A {
    @Override
    public void foo() {
        System.out.println("foo");
    }
}
Run Code Online (Sandbox Code Playgroud)

否则,这是一个编译时错误.现在使用一个带有方法的默认实现的抽象类:

abstract class C {
    public void bar() {
        System.out.println("bar");
    }
}
Run Code Online (Sandbox Code Playgroud)

从这个抽象类继承的类看起来像这样:

class D extends C { }
Run Code Online (Sandbox Code Playgroud)

没有错误.但是如果它倾向于这样做,它也可以覆盖默认方法实现.

作者在那里说的是:如果你的API还不稳定,你需要调整接口(是的,抽象类也是接口(在OOP中说)),那么抽象类允许你添加东西而不会破坏类已经在那里了.但是,这仅适用于非抽象方法.如果添加抽象方法,则仍需要在每个派生类中实现它们.但是,如果你的API仍在不断发展并且已经有很多东西可以建立,那么它可以让你的生活更轻松.


Jus*_*ier 6

如果将具有默认实现的方法添加到抽象类,则不需要在任何派生类中更改任何内容.

或者,如果向接口添加方法,则实现该接口的任何类都需要实现该方法 - 否则它们将无法编译.