接口是行为契约,抽象类是共性模板;接口回答“能做什么”,抽象类回答“是什么”;选错类型会导致重构成本陡增,且受JVM语法铁律约束。
接口是行为契约,抽象类是共性模板
接口回答的是“它能做什么”,比如
、
;抽象类回答的是“它是什么”,比如
、
。选错类型会导致后期重构成本陡增——用接口强行塞状态字段,会暴露
常量的滥用;用抽象类替代多行为组合,会卡死继承链,无法再扩展其他能力。
当你需要让
同时具备飞行、鸣叫、可序列化能力时,必须用接口(
),抽象类做不到这点
当你发现多个子类重复写
或共享
字段时,抽象类才是合理选择;接口里不能放
Java 8+ 允许接口有
方法,但别把它当抽象类用——
只用于向后兼容或极简逻辑,复杂实现仍该下沉到抽象类
构造器、字段、修饰符的硬性限制
这些不是设计风格差异,而是 JVM 层面的语法铁律,违反直接编译失败。
接口不能有构造器:写
→ 报错
接口字段自动被加上
:写
等价于
,想存实例状态?只能去抽象类
抽象方法的访问修饰符:抽象类中可用
,但接口中
会编译报错——接口方法只能是
(且不能显式写出来)
继承与实现:单 vs 多的根本约束
这是 Java 类型系统最不可绕过的现实。不是“推荐”单继承,而是语言本身禁止:
是非法语法。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
一个类只能
一个抽象类,但可以
任意多个接口
接口之间支持多继承:
合法;抽象类之间不行
如果已有类在继承链中(比如
),又想赋予它点击、拖拽、可撤销等能力,只能靠接口——此时抽象类已无插足余地
默认方法不是万能补丁,滥用反而破坏语义
方法常被误当作“接口也能写实现”的信号,但它本质是妥协产物:为避免修改大量实现类而引入的向后兼容机制,不是设计新功能的首选路径。
立即学习
“
Java免费学习笔记(深入)
”;
不要在接口里写带状态变更的
方法,比如
—— 接口没有实例字段,这行代码根本通不过编译
多个接口含同名
方法时,实现类必须显式覆写,否则
编译错误
:
中若
和
都有
,
必须重写
真正需要复用逻辑时,优先提取成工具类 + 静态方法,或用组合(如抽象类持有一个
接口),而非把业务逻辑塞进接口
真实项目里最常翻车的,是把“暂时没共用代码”当成用接口的理由,结果半年后发现所有实现类都在抄同一段校验逻辑——这时候再想抽抽象类,就得动继承树,牵一发而动全身。接口和抽象类的边界,不在语法上,而在你心里是否已经分清「能力」和「身份」。
FlyableSerializableAnimalShapepublic static finalBirdimplements Flyable, Singable, SerializablecalculateArea()colorprivate String colordefaultdefaultinterface A { A() {} }Interface cannot have constructorspublic static finalint x = 1;public static final int x = 1;protected abstract void init();protected void fly();publicclass Dog extends Animal, Mammalextendsimplementsinterface SmartDevice extends Connectable, Upgradable, Loggableclass Button extends Componentdefaultdefaultdefault void toggle() { this.enabled = !this.enabled; }defaultclass X implements A, BABdefault void run()Xrun()Strategy