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

时间:2009-01-20 17:13:07

标签: java interface accessibility abstract-class field

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

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

11 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:20)

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

public interface Sendable {
    public void sendMe();
}

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

如果要在超类中定义某些共享行为,则使用抽象类 - 但该类不能独立存在(需要进行子类化)。可能共享行为需要一些自己的状态 - 在这种情况下,它可以定义私有字段,并且它也可以具有只能它可以使用的私有方法。

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

    public abstract class A {

      protected Object thing;
    }

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

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

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