继承和接口是 Java 面向对象两大核心特性,Java 内置interface关键字,二者设计目的、使用场景截然不同,下面详细区分。
一句话核心答案
抽象类是「is a(是什么)」关系,接口是「has a(有什么能力)」关系。而且 Java 是单继承 **,一个类只能有一个爹,但可以有 N 个接口(能力)。**
1. 继承(extends)
继承通过extends实现,子类复用父类非私有属性与方法,拓展自身功能,Java只允许单类继承,支持方法重写。
示例代码
class Animal {
public void eat() {
System.out.println("动物在吃东西");
}
}
// Dog继承Animal
class Dog extends Animal {
public void bark() {
System.out.println("狗在汪汪叫");
}
}
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
d.eat(); // 继承父类方法
d.bark(); // 子类自有方法
}
}
一键获取完整项目代码
关键点
子类自动拥有父类成员变量与普通方法,实现代码复用;
可新增独有方法,也能重写父类方法;
Java 类单继承,多层继承容易提高代码耦合。
2. 接口(interface)
Java 原生interface关键字定义接口,只定义行为规范,不实现业务逻辑,实现类必须重写全部抽象方法;Java 一个类可通过implements实现多个接口。
JDK8 + 接口可拥有 default 默认方法、static 静态方法,但核心作用仍是定义行为契约。
示例代码
// 定义图形接口
interface IShape {
void draw(); // 抽象方法,实现类必须重写
}
// 圆形实现接口
class Circle implements IShape {
@Override
public void draw() {
System.out.println("画一个圆形");
}
}
// 矩形实现接口
class Rectangle implements IShape {
@Override
public void draw() {
System.out.println("画一个矩形");
}
}
public class Test {
public static void main(String[] args) {
IShape shape1 = new Circle();
shape1.draw();
IShape shape2 = new Rectangle();
shape2.draw();
}
}
一键获取完整项目代码
关键点
接口不能实例化,实现类未实现全部抽象方法则必须定义为抽象类;
用来统一行为标准,面向多态编程;
一个类能同时实现多个接口,突破单继承限制。
3. 继承 vs 接口对照表
特性 继承 (extends) 接口 (implements)
核心思想 代码复用,子类拥有父类资源 定义行为规范,约束实现
方法实现 普通方法可完整实现 抽象方法无实现;JDK8 有 default/static 方法
多实现 Java 类只能单继承 一个类可实现多个接口
成员变量 可以定义各类成员属性 默认常量public static final,不能定义实例变量
语义关系 is-a(是一种) can-do(具备某项能力)
4. 继承和接口组合使用
Java 常用:单继承一个父类 + 实现多个接口,兼顾代码复用与功能拓展。
示例代码
// 父类,提供通用代码
class Animal {
public void eat() {
System.out.println("动物在吃东西");
}
}
// 奔跑接口,定义能力
interface IRun {
void run();
}
// Dog继承父类+实现接口
class Dog extends Animal implements IRun {
@Override
public void run() {
System.out.println("狗在奔跑");
}
public void bark() {
System.out.println("狗在汪汪叫");
}
}
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
d.eat();
d.run();
d.bark();
}
}
一键获取完整项目代码
说明
Dog 通过继承 Animal 复用 eat (),通过实现 IRun 拓展奔跑能力,既有复用又灵活扩展。
5. 总结
特点 继承 接口
主要作用 复用已有代码 统一行为规范、拓展功能
变量 允许实例成员变量 仅常量
继承数量 类只能单继承 多实现无限制
适用场景 满足 is-a 从属关系,共用逻辑代码 多个类行为一致、实现不同,拓展额外功能
✅ 什么时候用继承
类满足严格的 is-a 关系,需要复用父类字段和方法时使用,控制继承层级,避免耦合过高。例:Dog extends Animal狗属于动物。
✅ 什么时候用接口
需要给不同类拓展相同能力、统一方法标准,多个类无父子关系但行为一致时使用。例:克隆接口interface Clone{void clone();},猫狗都能实现克隆。
🌟最终结论
✅ 继承 = 代码复用,描述 **is-a(是)关系✅ 接口 = 行为约束,描述can-do(能做)** 关系✅ Java 最佳实践:单继承 + 多接口,兼顾复用与拓展!🚀
💡 如果你有具体的应用场景或疑问,欢迎继续交流! 😃