接口的使用与接口与抽象类的区别

主讲教师:王少华     QQ群号:483773664

学习目标

  1. 掌握接口的定义与使用

  2. 理解接口与抽象类的区别

一、什么是接口

现实生活中,我们经常听到接口这个词,比如USB接口,那它是什么意思呢?我们拿USB接口为例,不管那个厂商生产的USB存储器,我们都可以通过USB接口让电脑识别出来,这是为什么呢?这是因为这些生产厂商遵循了一套相同的标准,并按照这个标准来生成USB设备。

在软件中,接口同样是一种规范和标准,它们可以约束类的行为,是一些方法特征的集合,但是没有方法的实现。因此,也可以把接口看成特殊的”抽象类“。

二、接口的定义

和定义类不一样,不使用关键字class,而使用关键字interface。

(一)定义语法

语法如下

1
2
3
4
[修饰符] interface 接口名 extends 父接口1,父接口2...{
    零个到多个常量定义...
    零个到多个抽象方法定义...
}

说明:

  1. 修饰符只能是public或省略

  2. 接口名只要符合Java标识符命名规范就可以,建议由多个有意义的单词连缀而成,首字母大写,单词与单词间不要有连接符

  3. 一个接口可以有多个直接父接口,但不能继承类。

  4. 接口里定义的属性只能是常量,而且不管是否使用了public static final修饰,接口里的属性总将使用这三个修饰来修饰

  5. 接口里没有构造器和初始块

  6. 接口中的方法,只能是抽象方法

(二)定义一个接口

1
2
3
4
5
6
public interface InterfaceDemo {
    //接口里定义的属性只能是常量
    int MAX_LENGTH = 50;
    //接口里定义的方法只能是抽象方法
    void getLength();
}

(三)验证:管是否使用了public static final修饰,接口里的属性总将使用这三个修饰来修饰

接口里的属性默认是使用public static final 修饰,因此即使另一个类处于不同包下,也可以通过接口来访问接口的常量属性


三、接口的继承

接口的继承和类继承不一样。接口的继承是多继承,多个接口之间用,分隔开。

和类继承相似,子接口扩展了父接口,并将获得父接口的抽象方法、常量属性等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface InterfaceA {
    String PRO_A="InterfaceA";
    public void testA();
}
public interface InterfaceB {
    String PRO_B="InterfaceB";
    public void testB();
}
public interface InterfaceC extends InterfaceA,InterfaceB{
    String PRO_C="InterfaceC";
    public void testC();
}
public class TestInterfaceExtends {
    public static void main(String[] args) {
        System.out.println(InterfaceA.PRO_A);
        System.out.println(InterfaceB.PRO_B);
        System.out.println(InterfaceC.PRO_C);
    }
}

四、使用接口

(一)接口的用途

接口不能创建实例

接口可以用于声明引用型的变量,且此变量必须指向实现了此接口的实现类的对象;

接口的主要用途是被实现类实现

(二)、接口的实现

接口实现,使用关键字:implements

一个类可以实现一个或多个接口,多个接口之间用逗号分隔开

Java具有单继承,多实现的特性

1
2
3
[修饰符] class 类名 extends 父类 implements 接口1,接口2...{
   类体部分
}

一个类实现了一个或多接口后,这个类必须完全实现这些接口的全部抽象方法,否则这个类必须定义为抽象类

1、全部实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class DemoD implements InterfaceA,InterfaceB,InterfaceC{
 
    @Override
    public void testC() {
        // TODO Auto-generated method stub
         
    }
 
    @Override
    public void testB() {
        // TODO Auto-generated method stub
         
    }
 
    @Override
    public void testA() {
        // TODO Auto-generated method stub
         
    }
 
}
2、部分实现 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class  DemoD implements InterfaceA,InterfaceB,InterfaceC{
 
    @Override
    public void testC() {
        // TODO Auto-generated method stub
         
    }
 
    @Override
    public void testB() {
        // TODO Auto-generated method stub
         
    }
 
    @Override
    public abstract void testA() ;
 
}

3 、定义引用变量

1
2
3
4
5
6
7
8
9
10
public class Test {
    public static void main(String[] args) {
        //创建一个InterfaceA引用型变量,指向一个DemoD对象,当InterfaceA使用
        InterfaceA interfaceA = new DemoD();
        interfaceA.testA();
        //创建一个InterfaceA引用型变量,指向一个DemoD对象,当InterfaceA使用
        InterfaceB interfaceB = new DemoD();
        interfaceB.testB();
    }
}

五、接口和抽象类

(一)都具有的特征

  1. 接口和抽象类都不能实例化,只能被其他类实现和继承

  2. 接口和抽象类都可以包括抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法

(二)差别

  1. 接口里只能包括抽象方法,抽象类可以包括普通方法;

  2. 接口里不能定静态方法,抽象类可以定义静态方法;

  3. 接口里只能定义静态常量属性,不能定义普通属性, 抽象类既可以定义普通属性,也可以定义静态常量属性

  4. 接口不能包括构造器,抽象类可以包含构造器,但抽象类中的构造器并不是用于创建对象,而让其子类调用这些构造器来完成属于抽象类的初始化操作;

  5. 接口不能包含初始化块,抽象类可以包括初始化块

  6. 一个类最多只能有一个直接父类,包括抽象类,但可以有多个接口。