欢迎大家来到IT世界,在知识的湖畔探索吧!
“这里是云端源想IT,帮你轻松学IT”
嗨~ 今天的你过得还好吗?
莫道人生多不足
眼前分明好时光
– 2023.06.26 –
接口(硬件类接口)是指同一计算机不同功能层之间的通信规则称为接口。
接口(软件类接口)是指对协定进行定义的引用类型。其他类型实现接口,以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似,接口可以包含方法、属性、索引器和事件作为成员。
今天小编给大家带来接口的相关知识点:接口是什么,Java中为什么要使用接口,怎么使用接口以及接口与抽象类的区别。那么首先我们来看看Java为什么要使用接口?
一、为什么要使用接口
首先,我们都知道Java不支持多继承,但是支持实现多接口,因此在使用中如果仅仅使用抽象类会具有相当大的局限性。
其次,从语义上来讲,抽象类是是一种严格的is-a关系,比如,学生是人,老师也是人。因此可以将学生和老师可以继承类people而接口更倾向于实现类具有一些公共的特性或方法,比如学生会拍球,海豚也会拍球。
例子如下:
public class people {
void speak(){
System.out.println(“说话”);
}
}
class Student extends people implements play{
@Override
void speak() {
super.speak();
}
@Override
public void playBall() {
System.out.println(“学生玩球”);
}
}
class Teacher extends people{
@Override
void speak() {
super.speak();
}
}
class Dolphin implements play{
@Override
public void playBall() {
System.out.println(“海豚玩球”);
}
}
interface play{
void playBall();
}
最后,接口是java多态的一种实现方式,可以降低程序的耦合度。
二、接口的概念
接口,是Java语言中的一种引用类型,是方法的集合,如果说类的内部封装了成员变量和构造方法,成员方法,那么接口的内部主要就是封装了方法。
接口的定义:
接口的定义和类的定义很相似,但是不再使用Class关键字进行声明,虽然它也会被编译成Class文件,但一定要明确他并不是类,而是另外一种引用类型。接口就是多个类的公共规范,接口也是一种引用数据类型。
接口中的内容
如果是JDK1.7,那么接口中包含的内容包含常量和抽象方法;
如果是JDK1.8,还可以包含默认方法和静态方法;
如果是JDK1.9,还可以包含私有方法。
三、接口的使用步骤
1、接口不能直接使用,必须要有一个实现类来实现该接口,通过implements关键字,一个实现接口的类可以被看做是接口的一个子类,需要重写接口中的所有抽象方法,创建该子类对象,就可以调用方法了。
接口的的格式
public interface 接口名称{
//抽象方法 (主要)(JDK1.7)
//常量 (JDK1.7)
//默认方法 (JDK1.8)
//静态方法 (JDK1.8)
//私有方法(JDK1.9)
}
含有抽象方法
抽象方法:使用abstract关键字修饰,没有方法体内容,该方法主要是提供给子类使用的
public interface InterfaceName{
public abstract void method();
}
含有默认方法和静态方法
默认方法: 使用default关键字修饰的方法,不可省略,供子类调用或者子类重写。
静态方法: 使用static关键字修饰,供接口直接调用。
含有私有方法和私有静态方法
私有方法: 使用private关键字修饰,供接口中的默认方法或者是静态方法调用。(JDK1.9)
public interface InterfaceName{
private void method(){
//方法体内容
}
}
2、接口的实现类必须重写(实现)接口当中的所有抽象方法。
实现:去掉abstract关键字,“;”换成“{ }”,即添加方法体内容
3、 创建实现类的对象,进行使用。
注意事项:如果实现类中并没有实现接口中的所有抽象方法,那么这个实现类自己必须是一个抽象类。
四、基本实现
实现的概述: 类与接口的关系是实现关系,即类实现接口,该类称为接口的实现类也可以称为接口的子类。实现的动作类似于继承,格式相仿,只是关键字不同,实现使用implements关键字。
- 非抽象类实现接口,必须重写接口中的所有抽象方法;
- 实现类继承了接口当中的默认方法,既可以直接调用,也可以重写。
public class 实现类 implements 接口名称{
//重写接口当中的所有抽象方法
//重写接口当中的默认方法(可选)
}
抽象方法的使用:必须全部实现
//定义一个接口
public interface Biological{
//定义一个吃东西的功能
public abstract void eat();
//休息
public abstract void sleep();
}
//定义一个实现类
public class Animal implements Biological{
@Override
public void eat(){
System.out.println(“吃东西”);
}
@Override
public void sleep(){
System.out.println(“睡觉”);
}
}
//定义测试类
public class InterfaceDemo01{
public static void main(String []args){
//创建子类对象
Animal ani=new Animal();
//调用重写之后的方法
ani.eat();
ani.sleep();
}
}
//输出结果
//吃东西
//睡觉
默认方法的使用:可以继承,也可以重写,二选一,但是只能通过实现类的对象来使用。
1、 继承默认方法
public interface Biological{
public default void fly(){
System.out.println(“天上飞”);
}
}
//定义实现类
public class Animal implements Biological{
//继承 什么也不写,直接调用
}
//定义测试类
public class InterfaceDemo02{
public static void main(String []args){
//创建子类对象
Animal ani=new Animal();
//调用默认的方法
ani.fly();
}
}
//输出结果
//天上飞
2、重写默认方法
public interface Biological{
public default void fly(){
System.out.println(“天上飞”);
}
}
//定义实现类
public class Animal implements Biological{
//重写
@Override
public void fly(){
System.out.println(“自由自在的飞”);
}
}
//定义测试类
public class InterfaceDemo02{
public static void main(String []args){
//创建子类对象
Animal ani=new Animal();
//调用默认的方法
ani.fly();
}
}
//输出结果
//自由自在的飞
静态方法的使用
静态一般是和类.class文件相关,我们只能使用接口名来调用,不可以通过实现类的类名,或者是实现类的对象来调用
public interface Biological{
public static void run(){
System.out.println(“跑”);
}
}
public class Animal implements Biological{
//无法重接静态方法
}
public class InterfaceDemo{
public static void main(String []args){
Biological.run();
}
}
//输出结果
// 跑
私有方法的使用
- 私有方法:只有默认方法能使用;
- 私有静态方法: 默认方法和静态方法可以使用。
如果一个类中有多个默认方法,并且方法中有重复的内容,那么可以抽取出来,封装到私有方法当中,供默认方法去调用,从设计的角度考虑,私有的方法是对默认方法和静态方法的一种辅助。
//定义一个接口
public interface Biological{
private void run1(){
System.out.println(“撒旦撒旦撒”);
}
public default void funMethod1(){
// System.out.println(“撒旦撒旦撒”);
run1();
}
public default void funMethod2(){
// System.out.println(“撒旦撒旦撒”);
run1();
}
}
五、各种重名及解决方案
1、抽象方法
接口中有多个抽象方法,实现类必须重写所有抽象方法,如果方法重名,只需要重写一次即可。
//定义多个接口
public interface Animal{
public abstract void eat();
public abstract void run();
}
public interface human{
public abstract void eat();
public abstract void run();
}
//定义实现类
public class People implements Animal{
@Override
public void eat(){
System.our.println(“吃东西”);
}
@Override
public void run(){
System.our.println(“跑”);
}
}
2、默认方法
接口中有多个默认方法,实现类都可以继承使用默认方法,如果默认方法有重名,必须重写一次。
public interface A{
public default void methodA(){
}
public default void method(){
}
}
public interface B{
public default void methodB(){
}
public default void method(){
}
}
//定义一个实现类
public class C implements A,B{
@Override
public void method(){
System.out.println(“method方法被重写”);
}
}
3、静态方法
接口中,如果存在重名的静态方法并不会发生冲突,因为是只能通过各自的接口名访问静态方法。
六、优先级的问题
当一个类继承了一个父类,又实现了多个接口,父类中的成员方法与接口中的默认方法重名,那么子类就近选择执行父类的成员方法。
public interface A{
public default void methnodA(){
System.out.println(“AAAAAAAA”);
}
}
//定义父类
public class D{
public void methodA(){
System.out.println(“DDDDDDDD”);
}
}
//定义子类
public class E extends D implements A{
//未重写methodA()方法
}
//测试类
public class Test{
public static void main(String []args){
//创建子类对象
E e=new E();
e.methodA();
}
}
//输出结果
//DDDDDDDD
七、接口的多继承
一个接口能继承一个或者多个接口,这和类之间的继承关系比较相似,extends关键字,子接口继承父接口的方法,如果父接口中默认方法有重名,那么子接口需要重写一次。
public interface A{
public default void method(){
System.out.println(“AAAAAAAA”);
}
}
public interface B{
public default void method(){
System.out.println(“BBBBBBB”);
}
}
//定义子接口
public interface C extends A ,B{
@Override
public default void method(){
System.out.println(“CCCCCCCC”);
}
}
备注: 子接口重写默认方法,default保留。
其他成员特点
- 接口中无法定义成员变量,但是可以定义常量,因为值不可变,默认使用public static final修饰
- 接口当中没有构造方法,不能创建对象
- 接口当中,没有静态代码块
接口的好处
- 设定规则
- 降低耦合性
- 拓展原来类的功能
八、接口和抽象类的区别
相同点
- 都包含抽象方法;
- 其子类都必须重写这些抽象方法;
- 都不能自己实例化对象;
- 都位于继承的顶端,用于被其他类实现或者继承。
不同点
- 抽象类可以包含成员方法,接口不能包含普通成员方法;
- 一个类只能继承一个直接父类(可以是抽象类),一个类也可以实现多个接口;
- 类与类之间是单继承关系,接口与接口之间是多继承关系;
- 抽象类可以定义普通成员方法,接口只能定义常量。
本文对于Java中接口的相关问题做了详细的讲解,你学会怎么使用接口了吗?今天就先讲到这里了,更多Java基础知识持续更新中,欢迎一起学Java!
我们下期再见!
END
文案编辑|云端学长
文案配图|云端学长
内容由:云端源想分享
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/30172.html