java – 接口的意图与抽象方法的抽象类有何不同?
解释/序言
在Java中,如果使用抽象方法声明抽象类,例如 public abstract class MyAbstractClass { private String m_id; // default behavior public MyAbstractClass() { setId(null); } public String getId() { return m_id; } public void setId(String id) { m_id = id; } // overridenable method public void doSomething() { /* does nothing by default */ } // to-be-defined behavior public abstract void setSomething(Object o); public abstract Object getSomething(); } 你可以有效地声明一个具有各种“默认行为”的类(m_id的getter和setter),以及强制该类由必须实现“缺失”(抽象)方法的子类实例化,例如: public class MyClass extends MyAbstractClass { private Object m_o; // implements some actual complex behavior public void setSomething(Object o) { m_o = o; } public Object getSomething() { return m_o; } } 甚至可能覆盖超类中的方法. 所以看起来抽象方法的抽象类就像是一个接口, public interface IMy { public void setSomething(Object o); public Object getSomething(); } 因为要使用它,它必须最终指向一个实际的对象. 问题 它几乎看起来好像在现有的接口和抽象类与抽象方法(ACWAM)中没有任何意义,因为它们看起来非常相似. > ACWAM看起来非常类似于界面!我认为根本区别在于他们的意图. 你能提供一个或两个简单的例子(指向另一个文件会很好)来说明这两个人的意图(或“好用”)的差异,即接口和ACWAM? 解决方法
接口和抽象类之间的最大区别是:
>抽象类强制实现“是一种”关系.您必须子类化抽象类.您永远被绑定到特定的类层次结构中 一个好的规则就是API应该始终引用接口. 请注意,JDK中充斥着早期在使用接口应该使用的(抽象)类的错误. Stack就是一个很好的例子:Stack应该是一个接口,但它是一个类.如果你想实现自己的堆栈,你必须继承java.util.Stack,这是非常规范的 – 你可能不想这样做 – 也许你需要一个超轻量级版本等. 然而,抽象类确实有它们的位置:它们可以提供接口的默认实现.一个很好的例子是java.util.AbstractMap,这是一个java.util.Map接口的骨架实现. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |