Java 接口入门学习笔记:从概念到简单实践
作为一名正在学习 Java 的学生,最近在接触 “接口” 这个概念时,总觉得它有点抽象。不过跟着教程梳理后,发现接口其实是 Java 里很基础也很实用的知识。今天就把自己的学习心得整理出来,希望能帮到和我一样刚入门的同学。
一、先搞懂:接口到底是什么?
简单来说,接口(Interface)是 Java 中的一种特殊结构,它像一份 “协议” 或者 “说明书”,规定了某个类应该有哪些方法,但不规定这些方法具体怎么实现。
举个生活中的例子:我们用的充电接口,不管是手机充电口还是电脑充电口,都有明确的 “规则”—— 比如插脚数量、电压规格。这就像接口规定了 “充电” 这个功能的标准;而不同品牌的充电器(就像不同的类),只要遵守这个接口规则,就能给设备充电,具体怎么实现充电(比如快充技术),则由充电器自己决定。
二、Java 接口的基础语法
在 Java 中,定义接口要用interface
关键字,语法很简单:
// 定义一个接口
public interface 接口名 {// 常量(接口中的变量默认是public static final)数据类型 常量名 = 常量值;// 抽象方法(接口中的方法默认是public abstract)返回值类型 方法名(参数列表);
}
比如,我们可以定义一个 “能跑的” 接口:
// 定义“跑”的接口
public interface Runnable {// 常量:默认跑步速度(单位:米/秒)double DEFAULT_SPEED = 5.0;// 抽象方法:定义“跑”的行为void run();
}
这里要注意两个点:
- 接口里的变量默认被
public static final
修饰,所以必须初始化,而且不能被修改(相当于常量); - 接口里的方法默认被
public abstract
修饰,只有方法声明,没有方法体(不能写{}
)。
三、如何使用接口?——“实现” 接口
接口不能直接创建对象,必须由其他类 “实现”(遵守接口的规则)。实现接口要用implements
关键字,并且必须实现接口中所有的抽象方法。
语法如下:
// 实现接口
public class 类名 implements 接口名 {// 实现接口中的所有抽象方法@Overridepublic 返回值类型 方法名(参数列表) {// 具体实现逻辑}
}
还是用上面的 “Runnable” 接口举例,我们可以让 “人” 和 “狗” 这两个类实现它:
// 人类实现“跑”的接口
public class Person implements Runnable {@Overridepublic void run() {// 实现“人跑步”的逻辑System.out.println("人用两条腿跑步,速度是" + DEFAULT_SPEED + "米/秒");}
}// 狗类实现“跑”的接口
public class Dog implements Runnable {@Overridepublic void run() {// 实现“狗跑步”的逻辑(狗跑得比默认速度快)System.out.println("狗用四条腿跑步,速度是8.0米/秒");}
}
这样一来,Person
和Dog
都遵守了Runnable
接口的规则(都有run()
方法),但实现方式不同,很灵活。
四、为什么要学接口?—— 接口的核心作用
作为学生,刚开始可能会疑惑:有了类和继承,为什么还要用接口?其实接口有两个很重要的作用:
统一标准,实现 “多态”
不同的类只要实现了同一个接口,就可以被当作接口类型来使用。比如上面的Person
和Dog
,都可以被赋值给Runnable
类型的变量:public class Test {public static void main(String[] args) {// 多态:不同对象可以统一用接口类型接收Runnable runner1 = new Person();Runnable runner2 = new Dog();// 调用run()方法,会执行各自的实现逻辑runner1.run(); // 输出:人用两条腿跑步,速度是5.0米/秒runner2.run(); // 输出:狗用四条腿跑步,速度是8.0米/秒} }
这样做的好处是:如果后续需要新增一个 “会跑的” 类(比如
Cat
),只要实现Runnable
接口,就可以直接用在需要Runnable
类型的地方,不用修改原有代码 —— 这在实际开发中能大大降低代码的耦合度。弥补 Java “单继承” 的限制
Java 中一个类只能继承一个父类(单继承),但可以同时实现多个接口(用逗号分隔)。比如:// 定义“跳”的接口 public interface Jumpable {void jump(); }// 一个类可以同时实现多个接口 public class Rabbit implements Runnable, Jumpable {@Overridepublic void run() {System.out.println("兔子蹦蹦跳跳地跑");}@Overridepublic void jump() {System.out.println("兔子跳得很高");} }
这样,Rabbit
类就同时拥有了 “跑” 和 “跳” 的能力,比单继承更灵活。
五、新手常见问题:接口和抽象类有什么区别?
刚开始学的时候,很容易把接口和抽象类(带抽象方法的类)搞混。这里用一个表格简单对比:
对比维度 | 接口(Interface) | 抽象类(Abstract Class) |
---|---|---|
定义关键字 | interface | abstract class |
继承 / 实现方式 | 类用implements 实现,可多实现 | 类用extends 继承,只能单继承 |
方法实现 | 不能有方法体(抽象方法) | 可以有抽象方法,也可以有普通方法 |
变量 | 只能是常量(默认public static final ) | 可以有普通变量,也可以有常量 |
核心作用 | 定义标准,实现多态和多实现 | 抽取共性,作为父类统一管理 |
简单总结:如果需要定义 “标准”,让多个不相关的类遵守,就用接口;如果需要抽取多个类的共性(包括方法实现),就用抽象类。
五、写在最后:接口在实际开发中的作用
虽然现在我们写的代码比较简单,但接口在实际项目中非常重要:
- 比如 Java 中的
List
接口(集合框架),规定了 “列表” 的标准方法(add()
、get()
等),而ArrayList
、LinkedList
等类实现了它,我们可以根据需求选择不同的实现类,却不用改调用代码; - 再比如开发中的 “分层架构”,接口可以用来定义 “服务层” 的标准,让 “实现层” 自由替换(比如从本地存储换成数据库存储),不用修改上层代码。
作为学生,刚开始不用追求复杂用法,先掌握 “接口定义→类实现→使用多态” 的基础流程,慢慢在练习中理解它的设计思想就好。
如果有错误,欢迎大家指出呀!一起加油学 Java~