3分钟带你快速了解 Java 接口

我醉欲眠卿且去

明朝有意抱琴来


目录

接口的概念

定义接口 

接口格式 

接口的特性 

(1)接口不能直接创建对象

(2)接口不能用 final 修饰

(3)接口中定义的变量

(4)接口中定义的方法

接口的作用

抽象类与接口

抽象类

接口

 

 

接口的概念

在我们现实生活中接口的例子十分的常见。比如:USB接口、插座接口等等


电脑的USB口上,可以插:U盘、鼠标、键盘等等所有符合USB协议的设备

电源插座插孔上,可以插:电脑、电视机、电饭煲等等所有符合规范的设备

通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在 Java 中,接口可以看成是:多个类的公共规范,是一种引用数据类型

定义接口 

接口格式 

定义一个接口跟定义一个类的格式差不多,只不过是将 class 关键字换成 interface 关键字

[public] interface <接口名> {
    //常量
    //抽象方法、静态方法、默认方法
}
public接口的修饰符只能是 public ,只有这样接口才能被任何包中的接口或者类访问
interface 接口的关键字
接口名定义方式跟类名一样 
常量在接口中不能声明变量,因为接口要具备三个特征,公共性、静态的、最终的

接口的特性 

我们一旦在 Java 程序中创建了接口后,接口的方法和抽象类是一样的,它的方法都是抽象的,也就是说接口不具备有实现的功能(不能被创建对象)它只是指定要做那些工作,而不管怎么去做。接口就如用户提出的需求,最后由你去扩展它的实现类

(1)接口不能直接创建对象

接口类型是一种引用类型,但是不能直接 new 接口的对象

(2)接口不能用 final 修饰

因为接口就是为了让子类实现的,如果将接口封闭了,那么接口将没有任何意义

(3)接口中定义的变量

我们现在接口中定义一个变量,我们发现编译器会提示我们进行初始化

 当我们初始化后就正常了,这是什么回事呢?

 看一下这段代码反编译后的字节码,如下图:

我们发现接口中定义的变量会在编译的时候自动加上 public static final 修饰符,这样我们在接口中便只能定义常量了 ~

(4)接口中定义的方法

接口中可以定义抽象方法、静态方法、默认方法(我们这里主要讲抽象方法)

public interface newJie {
    int a = 10;
    static void Func1(){
        System.out.println("这是一个静态方法");
    }
    
    void Func2();

    default void Func3() {
        System.out.println("这是一个默认方法");
    }
}

普通方法会默认转化成抽象方法:如下图我们给 Func2 加上方法体就报错了

在 Java 程序中,接口里的方法都是抽象的或者是公有的,在声明的时候可以省略掉关键字 public 和 abstract,因为它的方法都是编译器隐式加上的(与上文的接口中的变量一样)。当然我们添加了关键字也没有事 ~

 

接口的作用

接口不能直接使用,必须要有一个 "实现类" 来 "实现" 该接口,实现接口中的所有抽象方法

接口的格式

public  class 类名称 implements 接口名称{
 // ...
 } 

子类和父类之间是 extends 继承关系,类与接口之间是 implements 实现关系

interface Person{
    void eat();
}

class Student implements Person{
    public void eat(){
        System.out.println("吃学生餐");
    }
}

 

一个接口继承多个接口

在 Java 程序中,接口的继承与类的继承不一样。接口是支持多继承的,即一个接口可以有多个父类接口,与类的继承相似,子类接口要扩展某个父类接口,将会获得父类接口中的所有抽象方法、常量属性、等等。但一个接口继承多个父接口时,多个父接口排在 extendds 关键字之后,多个父接口之间以英文符号 “,” 隔开

interface A{
    int add();
}

interface B{
    int sub();
}

interface C{
    int mul();
}

interface D extends A,B,C{}

class E implements D{
    private int a;
    private int b;

    public E(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public int add(){
        return a+b;
    }

    public int sub(){
        return a-b;
    }

    public int mul(){
        return a*b;
    }
}

public class Test {
    public static void main(String[] args) {
        E e = new E(3,4);
        System.out.println("add="+e.add());
        System.out.println("sub="+e.sub());
        System.out.println("mul="+e.mul());
    }
}

我们发现 接口D 中继承了 接口A、B、C 中所有的抽象方法,因为 E类 继承了 接口D 能实现所有的抽象方法

一个类继承多个接口

我们在继承中讲过,Java 是不支持多继承的:

错误示范

class A{
    protected int a;
}

class B{
    protected int b;
}

class C extends A,B{}

虽然 Java 中不能实现类继承多个类,但是可以一个类继承多个接口 :

public interface Father {
    void Character();
}
---------------------------------------
public interface Mother {
    void Appearance();
}
---------------------------------------
class Child1 implements Father,Mother{
    protected String Name;
    protected int Age;
    @Override
    public void Character(){
        System.out.println("勇气");
    }
    @Override
    public void Appearance(){
        System.out.println("蓝眼睛");
    }

    public Child1(String name, int age) {
        Name = name;
        Age = age;
    }

    public void PrintChild() {
        System.out.println("姓名:"+this.Name+" 年龄:"+this.Age);
    }
}

class Child2 extends Child1{
    public Child2(String name, int age) {
        super(name, age);
    }
    @Override
    public void Character(){
        System.out.println("帅气");
    }
    @Override
    public void Appearance(){
        System.out.println("勤快");
    }
}
---------------------------------------
public class Test {
    public static  void Character(Child1 d){
        d.Character();
    }
    public static void Appearance(Child1 d){
        d.Appearance();
    }


    public static void main(String[] args) {
        Child1 child1 = new Child1("张三",18);
        child1.PrintChild();
        System.out.println("特征:");
        child1.Appearance();
        child1.Character();
        System.out.println("---------------------------------");
        Child2 child2 = new Child2("小美",19);
        child2.PrintChild();
        System.out.println("特征:");
        child2.Appearance();
        child2.Character();
    }
}

代码虽然有点长,我们来慢慢分析一下

问题:如何描述两个孩子的不太特征?

首先一个孩子的特性可以与父母有关:

于是我们可以定义了两个接口:Father、Mother

 

 我们由第一个孩子 Child1 继承这两个接口,并实现接口中的抽象类

 这个时候第二个孩子 Child2 就不用继承这两个接口了,我们直接继承 Child1 并重写接口方法

注意:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类

错误示范:

interface A{
    void Func1();
    void Func2();
}

class B implements A{
    public void Func1(){
        System.out.println("B");
    }
}

 

如果你此时不想实现,你可以将该类定义为抽象类,从而来避免这个错误

一个类只能继承一个类,但是一个类可以继承多个接口。这在编写程序时解决了一个类要具备多方面的特征 ~

抽象类与接口

抽象类

通过关键字 abstract 定义的类叫做抽象类。在 Java 中所有的对象都是通过类来描述的;但反过来,并不是所有的类都是用来描述对象的,抽象类就是其中的一种

这里展示一下什么叫抽象类: 

abstract class C{
    abstract void Func();
    public void Func1(){
        System.out.println("C");
    }
}

我们知道抽象类是至少有一个抽象方法的类叫做抽象类,这也意味着抽象类中存在不是抽象方法的方法。这样抽象类就不能算作是纯粹的接口,而是介于普通类与接口之间。

接口

是一个抽象类型,是抽象方法的集合;接口通过关键字 interface 来定义。接口与抽象类的不同之处在于:

接口中的成员变量隐式为 static final,但抽象类不是的
一个类可以实现多个接口,但只能继承一个抽象类
抽象类中可以存在有方法的方法,而接口中(除了静态方法、默认方法这些特殊方法)就只有抽象方法

接口是隐式抽象的,所以声明时没有必要使用 abstract 关键字

接口中的方法都是隐式 public 的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨长虹,孤鹜齐飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值