Java:接口 vs 抽象类(关于字段)

10

根据我的了解,我想强制一个类使用特定的私有字段(和方法)。我需要一个抽象类,因为接口只声明公共/静态/最终字段和方法。正确吗?

我刚开始我的第一个大型java项目,想确保以后不会给自己带来麻烦 :)


除接口中的 final 属性/方法外,这是正确的。 - Matthew Brubaker
11个回答

20

您不希望强制使用某些私有字段或方法。一般来说,您并不关心实现细节,而是关心接口。因此,请在几个接口中定义一些方法(取决于您需要多少),并定义实现它们的类。这可能会对您未来造成最小的影响。


4
我很惊讶有这么多字面回答这个问题,而你的回答是唯一一个涉及到问题背后错误假设的。+1 - Steven A. Lowe

20

通常情况下会提供两者,以便最终得到:

public interface Sendable {
    public void sendMe();
}

public abstract class AbstractSender implements Sendable {
    public abstract void send();

    public void sendMe() {
        send(this.toString());
    }
}

这样,任何对抽象类中默认实现满意的人可以快速地继承它而无需重写很多代码,但是任何需要做一些更复杂的事情(或需要继承自不同基类)的人仍然可以实现该接口并进行插拔式开发。


你不想要一个实现 Sendable 的 AbstractSender 吗? - Milhous
是的。已经更正了。实际上,我想要一个不那么牵强的例子,但是脑海中暂时没有想到。 - Richard Campbell
如果一个类包含抽象方法,那么这个类本身必须被声明为抽象类。你的代码是否能够编译通过? - cdunn2001

4

私有字段和方法不能被子类使用(除非它们也是内部类)。但您可以将它们设为受保护的。


3
一个接口定义了与实现类外部世界的接口(契约)。一个(抽象或非抽象)超类的公共方法也是如此。你不应该试图要求子类有某些私有成员 - 你试图指定实现,而面向对象编程的目标就是避免这种情况。
当你想在一个超类中定义一些共享行为,但是该类不能独立存在(需要被子类化)时,你可以使用抽象类。可能共享的行为需要一些自己的状态 - 在这种情况下,它可以定义私有字段,并且它也可以有只有它自己可以使用的私有方法。
即使你从抽象类继承,你也无法访问其私有字段/方法。

1

这是正确的。但这不一定是一个非此即彼的决定,您可以通过提供骨架实现来结合接口和抽象类的优点。您可以在《Effective Java, 2nd Ed.》的第18项(“优先使用接口而不是抽象类”)中找到对这种方法的非常有趣的描述。


1

没错。接口是为公共使用而设计的。而私有实现需要在抽象(或具体)类中。


1
如果你发现自己在猜测应该选择哪一个,我建议你偏向于接口 - 拥有一个本应该是抽象类的接口总比反过来要好。

1

接口定义行为规范,而不是属性。


1
我想强制一个类使用特定的私有字段(和方法)
你问题的这一部分是有问题的:为什么你认为你想要这样做?
私有成员对子类不可见,接口定义公共接口,所以你唯一的选择就是使用抽象类...但我想不出任何人为什么会想要这样做。

0
如果你想让子类定义特定的方法,使用接口就可以解决问题。正如其他人所说,重点不在于子类如何实现,而在于它必须实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接