接口是 java 中的核心概念之一,Java 接口是 Java 编程语言的核心部分,不仅在 JDK 中而且在 Java 设计模式中也被广泛使用,大多数框架大量使用 java 接口。
那么什么是接口?为啥需要使用接口?接口应该怎么使用?本文一一给大家介绍。
一、什么是接口?
在 Java 中,接口是一种抽象类型,包含方法和常量变量的集合,它是 Java 中的核心概念之一,用于实现抽象、多态和多重继承。
Java 接口是方法名称的集合,只是名称,没有函数体,这些函数是作为接口定义的工作的一部分执行的。
例如,如果我们有一个动物类,动物可能会有许多不同的动作,一个类可以实现任意数量的接口。
二、为啥需要使用接口?
数据抽象
实现多重继承
允许不同的对象轻松交互
促进软件的重用
这里我们可以举个例子给大家说明一些下,为啥我们需要接口。
如果你有个需求,猫咪要集成动物类和宠物类:
但是 Java 是不支持多集成的,所以这个时候你应该怎么办?
那肯定是使用接口去实现,猫咪可以继承动物类,实现宠物类。
我们用代码的形式简单去实现一下。
首先写一个 Pet 接口:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 6:39
* @description: 宠物接口
*/
public interface Pet {
/**
* 奔跑方法
*/
void run();
}
复制代码
然后写一个猫咪的类去实现 Pet 接口:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 6:41
* @description:
*/
public class Cat implements Pet{
@Override
public void run() {
System.out.println("我是猫咪,我实现了Pet接口,并重写了run方法。");
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.run();
}
}
复制代码
运行结果:
我是猫咪,我实现了Pet接口,并重写了run方法。
复制代码
这就是接口的写法。
三、接口有哪些规则?
接口在使用过程中,有很多规则,我们必要要牢记,下面列举几个:
不能直接实例化接口,需要写具体的类去实现它。
接口可以为空,可以没有方法或变量。
接口中不能出现 final 关键字。
接口不能有构造函数,因为我们不能实例化它们,而且接口不能有带主体的方法.
实现接口的类必须为其所有方法提供实现,除非它是抽象类。
四、接口的优缺点
4.1 优点
接口可以帮助我们实现抽象。
Java 中不允许多继承,但是可以实现多个接口。
接口可以实现松耦合,一个类的变化不会影响其他类。
4.2 缺点
五、接口中其他重要点
5.1 默认方法
随着 Java 8 的发布,我们现在可以在接口内添加带有实现的方法,这些方法称为默认方法。
要在接口中声明默认方法,我们使用 default 关键字,例如:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 6:39
* @description: 宠物接口
*/
public interface Pet {
/**
* 奔跑方法
*/
void run();
/**
* 默认方法
*/
default void getAction(){
System.out.println("接口的默认方法");
}
}
复制代码
有没有疑问,为啥要引入默认方法?
如果我们需要在接口中添加一个新方法,可以在接口中添加方法而无需实现,但是这个不太现实,因为你一旦在接口中定义了一个新的方法,那么所有实现这个接口的实现类必须要重写这个新的方法,这肯定不是我们想要的结果
为了解决这个问题,Java 引入了默认方法,默认方法像普通方法一样被继承。
我们用代码的形式给大家演示一下:
接口 Pet:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 6:39
* @description: 宠物接口
*/
public interface Pet {
/**
* 奔跑方法
*/
void run();
/**
* 默认方法
*/
default void dance(){
System.out.println("我会跳舞");
}
}
复制代码
实现类 1-猫咪:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 6:41
* @description:
*/
public class Cat implements Pet{
@Override
public void run() {
System.out.println("我是猫咪,我实现了Pet接口,并重写了run方法。");
}
@Override
public void dance() {
System.out.println("我是猫咪,我实现了Pet的默认方法,我会跳舞");
}
}
复制代码
实现类 2-狗狗:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 7:05
* @description:
*/
public class Dog implements Pet{
@Override
public void run() {
System.out.println("我是狗狗,我实现了Pet接口,并重写了run方法。");
}
}
复制代码
测试类:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 7:07
* @description:
*/
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.run();
cat.dance();
Dog dog = new Dog();
dog.run();
}
}
复制代码
输出:
我是猫咪,我实现了Pet接口,并重写了run方法。
我是猫咪,我实现了Pet的默认方法,我会跳舞
我是狗狗,我实现了Pet接口,并重写了run方法。
复制代码
我们注意到猫咪类有实现 Pet 接口中的默认方法 dance(),但是狗狗类没有实现该方法,这个就体现了灵活性,默认方法只是其中一个或者多个实现类需要用到。
5.2 静态方法
Java 8 中还引入了静态方法,所谓静态方法,就是用关键字 static 定义的方法。与 Interface 中的其他方法不同,这些静态方法包含函数的完整定义,并且由于定义完整且方法是静态的,因此这些方法在实现类中不能被覆盖或更改。
接口中的静态方法可以在接口中定义,但不需要在实现类中重写。
我们直接上代码:
Pet 接口:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 6:39
* @description: 宠物接口
*/
public interface Pet {
/**
* 静态方法
*/
static void eat(){
System.out.println("我是静态方法!");
}
}
复制代码
Cat 实现类:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 6:41
* @description:
*/
public class Cat implements Pet{
}
复制代码
Test 测试类:
package com.wangrui.kmz.test;
/**
* @author: wangrui
* @date: 2022/9/30 7:07
* @description:
*/
public class Test {
public static void main(String[] args) {
Pet.eat();
}
}
复制代码
输出:
六、总结
接口是 java 中非常重要也是很常用的,本文介绍了接口的定义、优缺点、使用,还有 java8 新引入的概念:默认方法、静态方法,希望本文对您学习接口有所帮助,有任何问题,欢迎在下方评论区与我讨论。
评论