Java接口
接口
接口就是给出一些没有实现的方法定义,等到某个类要使用时,再具体实现
interface 类名
{
属性
方法
};
class 类名 implements 接口名
{
属性
方法
//接口的所有抽象方法都要实现
接口方法的实现
}
接口中的抽象方法可以不用abstact修饰,jdk7之前接口中的所有方法都是抽象方法,而jdk8之后接口中的方法可以默认实现方法,但要用default修饰,也可以有静态方法
接口存在的意义
在我接口时一直有一个问题,直接在用到方法的类里直接实现方法不香吗?为什么还要定义接口呢?
可能对于现在阶段未工作的我们答案是这样的。
接口的便于维护和管理
比如我们有三个程序员要分别实现数据库Mysql,Orcel,DB2,我们都知道数据库有连接还有关闭功能,所以我们可以定义一个接口,让三个数据库都去实现这个接口,假如我们并不定义接口,a程序员可能实现这两个方法叫A,B,b程序员实现这两个方法又叫C, D这个每个程序员实现同样一种功能的方法,名字却各不相同,我们调用起来就很难搞,而这时候接口的作用就可体现出来了。
接口的作用还有很多,只是初学,我们先知道这玩意时是有用的就可以了。
接口的使用细节
1、接口不能被实例化
因为我们知道接口本身就是一个抽象的东西,关于为什么接口不能被实例化我搜索了一下资料,我们知道java的内存分为栈区、堆区、代码、静态数据这四部分。清楚了这个之后我们先看类的实例化是一个怎样的过程,如下图,首先我们先在栈区声明了一个per,然后JVM对per进行实例化,在堆区为其开辟一段空间,用来存储这个Person对象,那么堆内存里面具体存的是那些东西呢,其实堆内存里存储的是对象的属性,我们清楚这些之后就可以对接口进行分析了,接口中的属性是用static final修饰的,而我们看下图,可以知道java中static变量是存在方法区的,不在堆区,所以就没有必要在堆区为其分配内存,而方法也是不在堆区的,所以接口没有被实例化的必要,java就规定其不能被实例化
2、接口中的方法是public的,默认用public abstract修饰我们可以将其省略
3、一个普通类实现接口就必须将该类中的所有方法都实现(Idea中可以使用alt + /快速完成)
4、抽象类实现接口可以不用实现接口中的方法
5、一个类可以实现多个接口
interface I1
{}
interface I2
{}
class C implements I1, I2
{
//两个接口的方法都要实现
}
6、接口中的所有属性都是public static final
7、接口不能继承其他类,但是可以继承多个接口(这里的继承是和类的继承不相同的,类的继承是单一的,只能继承一个类,这里接口却可以继承多个接口)
偷懒这里就用上面的接口了
interface I3 extends I1, I2
{}
8、接口的修饰符只能是public和默认的(这点和类的修饰是一样的)
接口和继承对比
接口学到这里我们对接口就有了一个大概轮廓的认识,接口是对抽象类的延伸,接口是对行为的抽象,java为了保护数据安全是不允许多继承的,而接口则弥补了这一种缺陷,是对单继承机制的补充。
继承是is_a的关系,而接口时like_a的关系
接口的多态
1、接口可以接收实现了接口的类,接口变量可以接收实现了该接口的对象实例
2、多态传递
如果一个接口IA继承了接口IB,一个类A实现了IA,那么我们可以用IB接口类型的变量来接收类A的实例,这就相当于A也实现了接口B,所以B类型的接口也可以接收A类的实例
package Interface;
public class Interface01 {
public static void main(String[] args) {
A a = new A();
IH Ih = a;
IG Ig = a;
}
}
interface IH{}
interface IG extends IH{}
class A implements IG{
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY