Java中的接口

200 阅读5分钟

接口

接口定义了一组规则,用于描述类具有什么功能,但并不给出具体实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。类要遵从接口描述的统一规则进行定义,所以,接口是对外提供的一组规则、标准。比如Type-C接口,Type-A接口

一、JAVA接口的特点

就像一个类一样,一个接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体)。

  • 接口规定了一个类必须做什么和不能做什么,相当于类的蓝图。

  • 接口描述了一种能力,即汽车必须能跑,飞机必须能飞。

  • 抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法。接口是百分之百的抽象类

  • 接口不允许实例化

  • 接口的抽象方法不能是private、protected、final。

  • 接口的变量是隐式public statci final。所以其值无法改变

  • 声明类的关键字是class,声明接口的关键字是interface。

二、接口可以做些什么

1.接口使某些实现类具有我们想要的功能,比如说,实现了 Cloneable 接口的类具有拷贝的功能,实现了 Comparable 的类具有比较功能。

2.Java原则上只支持单一继承,但通过接口可以实现多重继承的目的。

3.实现多态,通俗的理解,就是同一个事件发生在不同的对象上会产生不同的结果,鼠标左键点击窗口上的 X 号可以关闭窗口,点击超链接却可以打开新的网页。

接下来解决一下课前的问题: -我们创建一个USB接口

public interface USB {
    void connect(String s);
    void disconnect(String s);

}

ublic class Computer implements Type_A,Type_C,USB {

    @Override
    public void ACRecharge(int s) {
        System.out.println("AC充电功率为"+s+"w");
    }

    @Override
    public void PDRecharge(int s) {
        System.out.println("PD充电功率为"+s+"w");
    }

    @Override
    public void connect(String s) {
        System.out.println(s+"设备已连接");
    }

    @Override
    public void disconnect(String s) {
        System.out.println(s+"设备已断开连接");
    }
}
  • 测试类
public class Test {
    public static void main(String[] args) {

        Computer mouse=new Computer();
        mouse.connect("鼠标");
        mouse.disconnect("鼠标");
        mouse.ACRecharge(5);
        Type_C keyboard=new Computer();
        keyboard.connect("键盘");
        keyboard.disconnect("键盘");
        keyboard.PDRecharge(10);

    }
}

多态存在的前提:

  • 要有继承关系,
  • 子类要重写父类的方法,重写了connect()disconnect()方法
  • 父类引用指向子类对象,keyboard引用指向Computer。

三、接口与类和抽象类的区别

  • 普通类:只有具体实现
  • 抽象类:具体实现和规范(抽象方法)都有
  • 接口:只有规范(抽象方法),无法被实例化。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。 1.接口与类的区别
  1. 接口不能用于实例化对象。
  2. 接口没有构造方法。
  3. 接口中所有方法必须是抽象方法。
  4. 接口不是被继承了,而是被类实现。
  5. 接口支持多继承。

接口与抽象类的区别

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。

  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。

  3. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。 Q:如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类应当为什么类?

四、接口的实现

  • 接口的定义使用关键字interface interface 接口名{}
//实现一个USB的接口

package Demo02;

public interface USB {
    void connect();
    void disconnect();

}
  • 类和接口是实现关系,用implements表示 class 类名 implements 接口名,其它接口名...,...

package Demo02;

public class KeyBoard implements USB{

    @Override
    public void connect() {
        System.out.println("键盘已连接");
    }

    @Override
    public void disconnect() {
        System.out.println("键盘已断开连接");

    }
}


一个类可以实现多个接口

package Demo02;

public class Computer implements Type_A,Type_C {


    @Override
    public void ACRecharge(int s) {
        System.out.println(s);
    }

    @Override
    public void PDRecharge(int s) {
         System.out.println(s);
    }

    @Override
    public void connect() {
        System.out.println("设备已连接");
    }

    @Override
    public void disconnect() {
        System.out.println("设备已断开连接");
    }
}

  • 接口与接口之间是继承关系,可以多继承 接口 extends 接口1,接口2,接口3..
//因为Type_A,Type_C属于是USB接口,但又有所区别,所以我们可以创建一个USB接口,让其他的两个接口继承的方法。
package Demo02;

public interface USB {
    void connect();
    void disconnect();
}
//Type_C接口有了PD充电的方法后也继承了USB的连接方法
public interface Type_C extends USB{
    void PDRecharge();

}
Type_A接口有了AC充电的方法后也继承了USB的连接方法
public interface Type_A extends USB{

    void ACRecharge();
}



我们不能直接去实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的,这样怎么可能产生具体的实例呢?但是,我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法(实际上就是使用了Java中多态的特性)

public class Test {
    public static void main(String[] args) {
    
        Mouse mouse1 =new Mouse();
        mouse.ACRecharge(5);
————————————————————————————————————————
        Type_A mouse=new Mouse();
        mouse.ACRecharge(5);
    }
}