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

根据我收集的内容,我想强制一个类使用特定的私有字段(和方法)我需要一个抽象类,因为接口只声明public / static / final字段和方法。 正确??

我刚开始我的第一个大型java项目,并希望确保我以后不会伤害自己:)

提供这两者是相当普遍的,所以你最终得到:

public interface Sendable { public void sendMe(); } 

 public abstract class AbstractSender implements Sendable { public abstract void send(); public void sendMe() { send(this.toString()); } } 

这样,任何对抽象类中的默认实现感到满意的人都可以快速子类化它而无需重写大量代码,但是任何需要做更复杂事情(或者需要从不同基类inheritance)的人仍然可以实现界面和即插即用。

您不希望强制使用某些私有字段或方法。 一般来说,你不关心实现,你关心接口。 因此,在几个接口中定义几个方法(取决于您需要多少)并定义实现它们的类。 这可能会在将来伤害到你。

子类不能使用私有字段和方法(除非它们也是内部类)。 但是,你可以让它们受到保护。

接口定义了 – 与实现类之外的世界的接口(契约)。 (抽象或非抽象)超类的公共方法也是如此。 您不应该尝试要求子类具有某些私有成员 – 您正在尝试指定OOP完全避免的实现。

当你想在超类中定义一些共享行为时,你使用一个抽象类 – 但是这个类不能独立存在(它需要被子类化)。 可能是共享行为需要它自己的某种状态 – 在这种情况下它可以定义私有字段,并且它也可以具有只能它可以使用的私有方法。

即使您从抽象类inheritance,您也无法访问其私有字段/方法。

那是对的。 接口供公众使用。 私有实现需要在抽象(或具体)类中。

如果你发现自己猜测选择哪一个我建议在接口方面犯错误 – 最好有一个应该是抽象类的接口,而不是相反。

接口定义了行为契约 。 这就是他们需要的,而不是属性。

我想强制一个类使用特定的私有字段(和方法)

这部分问题值得怀疑:为什么你认为你想这样做?

私有成员对于子类是不可见的,并且接口定义了公共接口,因此您唯一的选择是使用抽象类……但我想不出有什么理由为什么有人会想要这样做

这是对的。 但它不一定是一个或两个决定,您可以通过提供骨架实现和您的界面来结合接口和抽象类的优点。 您可以在Effective Java,2nd Ed中找到这种方法的非常有趣的描述 ,第18项(“首选接口到抽象类”)。

如果您希望子类定义特定方法,那么使用接口就可以了。 正如其他人所说的那样,并不是关于子类如何做到这一点,而是它做到这一点。

如果您希望类使用其他类的某些字段或方法,则可以将它们声明为受保护。

  public abstract class A { protected Object thing; } 

可以被同一个包中的另一个类访问(可以扩展A类,也可以不扩展)

 A a = new A(); a.thing.toString(); 

它不是真的“强迫”另一个类使用它,更像是“启用”。