一片文章带你吃透Java中的【接口-Interface】

简介: 一片文章带你吃透Java中的【接口-Interface】

🐳接口


在我们的生活中接口随处可见,例如家中的插线接口,网线接口,手机,电脑USB接口等等






🐯1.1 接口概述


接口就是一种公共的规范标椎,只要符合规范标准,大家都可以通用

java中的接口更多的体现在对行为的抽象


Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。


两种含义:

一,Java接口,Java语言中存在的结构,有特定的语法和结构;

二,一个类所具有的方法的特征集合,是一种逻辑上的抽象。

前者叫做“Java接口”,后者叫做“接口”。




🐶1.2 接口的特点


接口用关键字interface修饰


public interface 接口名 {}


public interface Jumpping {
 public abstract void jump();
}


类实现接口用implements表示

public class 类名 implements 接口类 {}


//类和接口之间不能用继承,这里采用implements实现的意思,类实现接口
public class Cat implements Jumpping {
    @Override
    public void jump() {
        System.out.println("猫猫跳的高");
    }
}


接口不能实例化

接口的实例化参照多态的方法,通过实现类对象实例化,这也叫做接口多态

多态的形式:具体类多态,抽象类多态,接口多态。

多态的前提:有继承或者实现关系;有方法重写;有父类(类/接口)引用指向(子/实现)类对象

接口实现类

要么重写接口中的所有抽象方法

要么是抽象类


public class JumppingDemo {
    public static void main(String[] args) {
        //接口也是抽象类,不能实例化,这里采用多态方法实例化
           Jumpping j = new Cat();
           j.jump();
    }
}


🦝接口的成员特点

成员变量

只能是常量

默认修饰符:public static final

构造方法

接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在一个类如果没有父类,默认继承Object类

成员方法

只能是抽象方法

默认修饰符: public abstract

🦄接口与类相似点:

一个接口可以有多个方法。

接口文件保存在 .java 结尾的文件中,文件名使用接口名。

接口的字节码文件保存在 .class 结尾的文件中。

接口相应的字节码文件必须在与包名称相匹配的目录结构中。


🐺接口与类的区别:


Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。

一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。


在语法上,抽象类和接口有着以下不同:


1.abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。 继承抽象类使用的是extends关键字,实现接口使用的是implements关键字,继承写在前面,实现接口写在后面。如果实现多个接口,中间用逗号分隔。例:


public class Main extends JApplet

public class Main implements Runnable

public class Main extends JApplet implements ActionListener


2.在abstract class中可以有自己的数据成员,也可以有非abstract的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

4.实现接口的类必须实现其中的所有方法,继承自抽象类的子类实现所有的抽象方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认具有 friendly权限,其值可以在子类中重新定义,也可以重新赋值。

7.接口中的方法默认都是 public abstract 类型的。


总的来说有以下几点


🐲接口不能用于实例化对象。 接口没有构造方法。

🐲接口中所有的方法必须是抽象方法,

🐲Java 8 之后 接口中可以使用 default关键字修饰的非抽象方法。

🐲接口不能包含成员变量,除了 static 和 final 变量。

🐲接口不是被类继承了,而是要被类实现。

🐲接口支持多继承。

🐸接口的功能


在Java语言规范中,一个方法的特征仅包括方法的名字、参数的数目和类型,而不包括方法的返回类型、参数名以及所抛出来的异常。在Java编译器检查方法的重载时,会根据这些条件判断两个方法是否是重载方法。但在Java编译器检查方法的置换时,则会进一步检查两个方法(分处超类型和子类型)的返还类型和抛出的异常是否相同。

接口实现和类继承的规则不同,为了数据的安全,继承时一个类只有一个直接父类,也就是单继承,但是一个类可以实现多个接口,接口弥补了类的不能多继承缺点,继承和接口的双重设计既保持了类的数据安全也变相实现了多继承。

Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化。但是接口不是类,不能使用new 运算符实例化一个接口。如 x=new comparable(…);//这个是错误来的。但是可以声明接口变量Comparable x; //这是允许的。


Java接口的方法只能是抽象的和公开的,Java接口不能有构造器,Java接口可以有public、static和final属性。即接口中的属性可以定义为 public static final int value=5;

接口把方法的特征和方法的实现分割开来。这种分割体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色由不同的演员来演,而不同的演员之间除了扮演一个共同的角色之外,并不要求其它的共同之处。


🐲接口的使用:


两个类中的两个类似的功能,调用他们的类动态的决定一种实现,那他们提供一个抽象父类,子类分别实现父类所定义的方法。

问题的出现:Java是一种单继承的语言,一般情况下,哪个具体类可能已经有了一个超类,解决是给它的父类加父类,或者给它父类的父类加父类,直到移动到类等级结构的最顶端。这样一来,对一个具体类的可插入性的设计,就变成了对整个等级结构中所有类的修改。

可插入性

在一个等级结构中的任何一个类都可以实现一个接口,这个接口会影响到此类的所有子类,但不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类可以从此类自动继承这些方法,当然也可以选择置换掉所有的这些方法,或者其中的某一些方法,这时候,这些子类具有了可插入性(并且可以用这个接口类型装载,传递实现了他的所有子类)。

我们关心的不是那一个具体的类,而是这个类是否实现了我们需要的接口。

接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口使得软件系统的灵活性和可扩展性,可插入性方面得到保证。

类型

使用Java接口将软件单位与内部和外部耦合起来。使用Java接口不是具体的类进行变量的类型声明,方法的返还类型声明,参量的类型声明,以及数据类型的转换。

在理想的情况下,一个具体的Java类应当只实现Java接口和抽象Java类中声明的方法,而不应当给多余方法。

等级结构

Java接口(以及抽象类)一般用来作为一个类型的等级结构的起点。

如果一个类已经有了一个主要的超类型,那么通过实现一个接口,这个类可以拥有另一个次要的超类型,这种次要的超类型叫做混合类型。


🐼接口的分类


🐶单方法接口


public interface Actionlistener{
public abstract void actionPerformed(ActionEvent event);
}


仅且只有一个方法,只有实现了这个接口(重写这个接口中的唯一一个方法),你才有资格去事件监听器列表里注册(参数为Actionlistener类型),当事件源变动时,自动调用这个唯一的actionPerformed方法。


🐭标识接口


是没有任何方法和属性的接口。标识接口不对实现它的类有任何语意上的要求,它仅仅表明了实现它的类属于一个特定的类型(传递)。


🐮常量接口


用Java接口来声明一些常量,然后由实现这个接口的类使用这些常量

定义接口格式:


[public]interface 接口名称 [extends父接口名列表]
{
//静态常量
[public] [static] [final] 数据类型变量名=常量值;
//抽象方法
[public] [abstract] [native] 返回值类型方法名(参数列表);
}


实现接口格式:


[修饰符] class 类名[extends 父类名] [implements 接口A,接口B,···]
{
类成员变量和成员方法;
为接口A中的所有方法编写方法体,实现接口A;
为接口B中的所有方法编写方法体,实现接口B;
}


示例:


创建一个接口


public interface Interface {
    public int num =10;//有成员变量
    public final int num2 = 20;//也可以是常量
}


创建测试类


/*
   测试类
 */
public class InterfaceDemo {
    public static void main(String[] args) {
        Interface i = new InterImpl();//多态方法
        //接口中的成员变量默认被final修饰,接口里面没有成员变量,默认为常量,且被静态修饰
        System.out.println(i.num);
        System.out.println(i.num2);
        System.out.println(Interface.num);//可以通过接口名直接访问
    }
}


创建一个类实现接口


//接口名后面加一个Impl表示接口的实现类
public class InterImpl implements Interface{
}


🐻‍❄️接口的继承

一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

接口的多继承

在Java中,类的多继承是不合法,但接口允许多继承。

标记接口

最常用的继承接口是没有包含任何方法的接口。


标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。


标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

没有任何方法的接口被称为标记接口。标记接口主要用于以下两种目的:


建立一个公共的父接口:

正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。


向一个类添加数据类型:

这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。


目录
相关文章
|
4天前
|
Java 开发者
探索 Java 的函数式接口和 Lambda 表达式
【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。
|
5天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
7 0
Java接口中可以定义哪些方法?
|
7天前
|
设计模式 Java
Java接口与抽象类
Java接口与抽象类
17 0
|
11天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
33 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
13天前
|
存储 Java
java接口和内部类
java接口和内部类
|
15天前
|
缓存 安全 Java
Java中函数式接口详解
Java 8引入函数式接口,支持函数式编程。这些接口有单一抽象方法,可与Lambda表达式结合,简化代码。常见函数式接口包括:`Function<T, R>`用于转换操作,`Predicate<T>`用于布尔判断,`Consumer<T>`用于消费输入,`Supplier<T>`用于无参生成结果。开发者也可自定义函数式接口。Lambda表达式使实现接口更简洁。注意异常处理和线程安全。函数式接口广泛应用于集合操作、并行编程和事件处理。提升代码可读性和效率,是现代Java开发的重要工具。
26 0
|
15天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
39 0
|
15天前
|
Java
Java中的多线程实现:使用Thread类与Runnable接口
【4月更文挑战第8天】本文将详细介绍Java中实现多线程的两种方法:使用Thread类和实现Runnable接口。我们将通过实例代码展示如何创建和管理线程,以及如何处理线程同步问题。最后,我们将比较这两种方法的优缺点,以帮助读者在实际开发中选择合适的多线程实现方式。
21 4
|
17天前
|
Java
在Java中,定义一个接口的步骤如下
【4月更文挑战第6天】在Java中,定义一个接口的步骤如下
5 1
|
1月前
|
Java
【Java】Clonable 接口
【Java】Clonable 接口
11 1

热门文章

最新文章