Skip to content

接口


基本介绍 ​

alt text

理解:接口就是一个编程规范,统一了某个方法的命名,同一个方法但是需要实现不同的功能就可以通过方法重写实现 ​

引入关键字:interface、implements ​

定义接口 ​

java
interface 接口名{
    // 属性
    // 抽象方法
}

实现接口 ​

java
class a implements 接口名{

}

接口中的属性 ​

基本介绍 ​

属性默认是 public static final 修饰的,即表示一个常量(命名采用全部大写 + 下划线),定义时必须赋值 ​

(1)final:无法通过接口修改接口中属性的值 ​

(2)static:可以通过接口名(即类名)访问接口中的属性 ​

访问属性 ​

java
public class main {
    public static void main(String[] args) {
        B b = new B();

        System.out.println(b.a);
        System.out.println(A.a);
        System.out.println(B.a);
    }
}

interface A{
    int a = 10; // 等价于 public static final a = 10;
}

class B implements A{

}

// 输出结果
10
10
10

代码分析 ​

(1)b . a:类实现了接口,b 是类 B 的一个实例,当然可以用实例对象去访问 ​

(2)A . a:接口中的属性是 public static final 修饰的,是静态属性,当然可以用类名访问 ​

(3)B . a:类 B 实现了接口,当然可以用类去访问 ​

接口中的方法 ​

(1)接口中一般定义抽象方法,用 abstract 修饰 ​

(2)接口中所有的方法默认是 public 修饰,定义抽象方法时可以省略 abstract 修饰符 ​

(3) JDK7 之前接口里的方法都没有方法体 ​

(4) JDK8 之后接口里的方法可以有静态方法、默认方法(使用 default 关键字修饰)(即接口中可以有方法的具体实现) ​

java
// defualt 关键字可以省略
default public void hi(){

}

public static void hi(){

}

代码示例 ​

java
package interface_;

public class main {
    public static void main(String[] args) {
        person_a person_a = new person_a();
        person_b person_b = new person_b();
        interface_implement.t(person_a);
        System.out.println("============================");
        interface_implement.t(person_b);
    }
}

interface database_tool{

    public void connect();
    public void close();

}

class interface_implement{
    public static void t(database_tool n){
        n.connect();
        n.close();
    }
}

class person_a implements database_tool{

    @Override
    public void connect() {
        System.out.println("程序员a  连接  了mysql数据库");
    }

    @Override
    public void close() {
        System.out.println("程序员a  关闭  了mysql数据库");
    }
}

class person_b implements database_tool{

    @Override
    public void connect() {
        System.out.println("程序员b  连接  了oracle数据库");
    }

    @Override
    public void close() {
        System.out.println("程序员b  连接  了oracle数据库");
    }
}

// 输出结果
程序员a  连接  了mysql数据库
程序员a  关闭  了mysql数据库
============================
程序员b  连接  了oracle数据库
程序员b  连接  了oracle数据库

代码分析 ​

(1)在接口中编写抽象方法,用于连接和关闭数据库,由类具体实现抽象方法 ​

connect() ​

close() ​

(2)类中使用 implements 实现接口,编写具体的方法实现接口中的抽象方法 ​

(3)编写 interface_implement 类,实现调用接口,传入不同实现类的对象,方法会自动调用对应类的具体实现 ​

使用细节 ​

(1)接口的修饰符只能是 public 、默认,这点和类的修饰符是一样的 ​

(2)接口不能被实例化(即不能创建一个接口对象) ​

(3)接口不能继承其它的类,但是可以继承多个接口 ​

没有接口实现接口之说,实现的对象应该是一个类,只能是继承接口 ​

(4)一个普通类实现接口,就必须实现该接口中的所有方法 ​

(5)一个类可以同时实现多个接口 ​

(6)抽象类实现接口,可以不用实现接口的方法 ​

接口与继承 ​

基本介绍 ​

接口是对 Java 中单继承机制的补充说明 ​

(1)继承的价值主要在于:解决代码的复用性和可维护性 ​

(2)接口的价值主要在于:设计好各种规范(方法),让其它类去实现这些方法,更加的灵活 ​

1. 接口比继承更加灵活,继承满足 is - a 的关系。而接口只需要满足 like - a 的关系 ​

2. 接口在一定程度上实现代码解耦(接口规范性 + 动态绑定机制) ​

代码示例 ​

monkey 通过实现接口,获取鱼类的游泳技能和鸟类的飞行技能 ​

java
public class Test {
    public static void main(String[] args) {
        monkey monkey = new monkey("monkey");
        monkey.climb_tree();
        monkey.swim();
        monkey.fly();
    }
}

interface fish{
    void swim();  // 默认是 public abstract
}

class animal{
    String name;
    // 构造器
    public animal(String name){
        this.name = name;
    }
}

// 类可以继承多个接口
class monkey extends animal implements fish{

    // 构造器
    public monkey(String name){
        super(name);
    }

    @Override
    public void swim() {
        System.out.println(getName() + "通过学习,获得——>鱼类的swim()方法");
    }

    public void climb_tree(){
        System.out.println(getName() + "本身拥有——>climb_tree()方法");
    }
}

// 输出结果
monkey本身拥有——>climb_tree()方法
monkey通过学习,获得——>鱼类的swim()方法

代码分析 ​

(1)首先创建两个接口,定义抽象方法 ​

(2)让 monkey 类实现多个接口 ​

(3)在 monkey 类中具体实现方法 ​

(4)在主函数中实现方法 ​

接口与多态 ​

基本介绍 ​

接口中体现了多态的应用,主要是如下几个方面 ​

(1)多态参数 ​

接口类型的变量可以指向任何实现该接口的对象,并通过接口调用方法(动态绑定机制) ​

(2)多态数组 ​

可以定义一个接口类型的数组,数组元素是实现了该接口的类对象 ​

(3)多态传递 ​

可以用一个父类接口变量指向实现了子类接口的对象 ​

多态参数 ​

bbb 类实现了 aaa 接口,在 ccc 类中编写 hi()方法,接收一个 aaa 类型接口的参数,通过该参数调用 hi()方法 ​

java
public class Test {
    public static void main(String[] args) {
        ccc ccc = new ccc();
        // 运行类型是 bbb,根据动态绑定机制,会调用 bbb 的 hi()方法
        bbb bbb = new bbb();
        ccc.hi(bbb);
    }
}

interface aaa{
    // 默认是 public abstract 修饰
    void hi();
}

class bbb implements aaa{
    @Override
    public void hi() {
        System.out.println("调用了 bbb 类的 hi()方法");
    }
}

class ccc {
    public void hi(aaa interFace) {
        interFace.hi();
    }
}

// 输出结果
调用了 bbb 类的 hi()方法

多态数组 ​

(1)编写 a 类,b 类,二者实现同一个接口,定义接口数组,存放 a 类、b 类的实例对象 ​

(2)遍历数组,调用共有的方法,如果遍历的是 b 类,调用独有的方法 ​

java
package a;

public class main {
    public static void main(String[] args) {
        arr[] interface_arr = new arr[2];
        interface_arr[0] = new a();
        interface_arr[1] = new b();
        for (int i = 0; i < interface_arr.length; i++) {
            interface_arr[i].shared_method();
            // 如果是b对象就调用其独有的方法
            if(interface_arr[i] instanceof b){
                ((b) interface_arr[i]).unique_method();
            }
        }
    }
}

interface arr{
    void shared_method();
}


class a implements arr{
    public void shared_method(){
        System.out.println("a类中调用了共有的方法");
    }
}

class b implements arr{
    public void shared_method(){
        System.out.println("b类中调用了共有的方法");
    }

    public void unique_method(){
        System.out.println("调用了b类独有的方法");
    }
}

// 输出结果
a类中调用了共有的方法
b类中调用了共有的方法
调用了b类独有的方法

多态传递 ​

间接实现多继承 ​

java
package d;

public class main {
    public static void main(String[] args) {
        B b = new test_class();
        A a = new test_class();
    }
}

interface A{
    void a();
}

interface B extends A{
    void b();
}

class test_class implements B{

    @Override
    public void a() {

    }

    @Override
    public void b() {

    }
}

代码分析 ​

(1)B b = new test_class(); ​

接口类型的变量可以指向,实现了该接口的类的对象实例 ​

(2)A a = new test_class(); ​

1. 类实现了接口 B,然而接口 B 是继承了接口 A,也相当于类实现了接口 A ​

2. 类即需要实现接口 A 中所有的抽象方法,也要实现接口 B 中所有的抽象方法 ​

3. 体现了多态传递 ​