Java中的接口是一种特殊的抽象类型,它定义了类需要遵循的规范,而实现类则是具体实现接口中定义的方法的类,二者配合是OOP中实现多态和解耦的核心方式。

Java接口的定义语法
接口使用interface关键字定义,接口中可以包含抽象方法、默认方法、静态方法和常量。接口中的抽象方法默认是public abstract修饰的,常量默认是public static final修饰的,这些修饰符可以省略不写。
下面是定义一个简单用户操作接口的示例:
// 定义用户操作接口
public interface UserDao {
// 抽象方法,查询用户列表
List<String> queryUserList();
// 抽象方法,添加用户,参数是用户名
void addUser(String userName);
// 默认方法,打印接口信息,Java8之后支持
default void printInfo() {
System.out.println("这是用户操作接口");
}
// 静态方法,获取接口版本
static String getVersion() {
return "1.0";
}
// 常量
String INTERFACE_NAME = "UserDao";
}
实现类的编写规则
一个类如果要实现某个接口,需要使用implements关键字,并且必须实现接口中所有的抽象方法,除非这个类本身是抽象类。实现类的方法访问权限必须是public,因为接口中的抽象方法默认是public的,子类重写时不能降低访问权限。
以下是实现上面UserDao接口的示例:
import java.util.ArrayList;
import java.util.List;
// UserDaoImpl实现UserDao接口
public class UserDaoImpl implements UserDao {
// 实现queryUserList抽象方法
@Override
public List<String> queryUserList() {
List<String> userList = new ArrayList<>();
userList.add("张三");
userList.add("李四");
return userList;
}
// 实现addUser抽象方法
@Override
public void addUser(String userName) {
System.out.println("添加用户:" + userName);
}
// 可选:重写默认方法,不重写则使用接口中的默认实现
@Override
public void printInfo() {
System.out.println("这是UserDaoImpl实现类的打印信息");
}
}
接口实现的核心技巧
1. 一个类可以实现多个接口
Java不支持类的多继承,但一个类可以实现多个接口,多个接口之间用逗号分隔。如果多个接口中有同名的抽象方法,实现类只需要实现一次即可。
// 定义第二个接口
public interface LogDao {
void printLog(String content);
}
// 一个类实现两个接口
public class UserDaoImpl implements UserDao, LogDao {
// 实现UserDao的方法
@Override
public List<String> queryUserList() {
return new ArrayList<>();
}
@Override
public void addUser(String userName) {
System.out.println("添加用户:" + userName);
}
// 实现LogDao的方法
@Override
public void printLog(String content) {
System.out.println("日志内容:" + content);
}
}
2. 接口可以继承多个接口
接口之间可以使用extends关键字继承,并且一个接口可以继承多个其他接口,这样子接口会拥有父接口的所有抽象方法和默认方法。
// 接口继承多个接口
public interface SuperDao extends UserDao, LogDao {
// 可以添加新的抽象方法
void deleteData();
}
3. 合理运用默认方法避免实现类强制修改
当接口需要新增方法时,如果直接添加抽象方法,所有实现类都需要修改代码实现新方法,容易引发问题。此时可以添加默认方法,给一个默认实现,不需要修改现有实现类的代码。
4. 接口引用指向实现类对象实现多态
实际开发中,通常会用接口类型来声明变量,指向具体的实现类对象,这样可以方便后续切换不同的实现类,降低代码耦合度。
public class Test {
public static void main(String[] args) {
// 接口引用指向实现类对象
UserDao userDao = new UserDaoImpl();
userDao.addUser("王五");
List<String> list = userDao.queryUserList();
System.out.println(list);
}
}
注意事项
- 接口中不能有构造方法,也不能直接实例化接口对象
- 实现类重写接口方法时,方法签名必须和接口中定义的一致,包括方法名、参数列表、返回值类型
- 如果实现类没有实现接口的所有抽象方法,那么这个实现类必须声明为抽象类
- 接口的默认方法可以被实现类重写,静态方法只能通过接口名直接调用,不能通过实现类对象调用