Java-接口

接口是一种特殊的类,由interface关键字定义,由抽象方法+全局常量组成。

一、接口的使用原则

  1. 每一个接口必须定义子类,子类使用implements关键字实现接口;
  2. 接口的子类(如果不是抽象类)则必须覆写接口之中所以定义的全部抽象方法;
  3. 利用接口的子类,采用对象的向上转型方式,进行接口对象的实例化操作。
语法格式: class 子类 [extends 父类] [implements 接口A,B..] {}

注意:接口之中只有抽象方法+全局常量。并且接口的访问权限只有public一种。

package com.joeaaa.demo07;

/*
* 定义接口,实现子类
*/
interface ifA {  
    public static final String MSGA1 = "hello A";
    public abstract void print1();

    // 接口中所有的方法均是全局方法,常量均为全局常量。public可省略
    String MSGA2 = "hello A";
    void print2();
}
interface ifB {
    public abstract void get();
}

class X implements ifA,ifB{ // 同时实现两个接口
    @Override
    public void print1(){ // 方法覆写
        System.out.println("X-print1");
    }
    @Override
    public void print2(){ // 方法覆写
        System.out.println("X-print2");
    }
    @Override
    public void get(){ // 方法覆写
        System.out.println("X-get");
    }
}
public class InterfaceTest1 {
    public static void main(String[] args) {
        ifA a = new X();
        ifB b = new X();
        a.print1();
        a.print2();
        b.get();
    }
}

二、接口在实际开发中三大功能

  1. 制定操作标准;
  2. 表示一种能力;
  3. 将服务器端的远程方法视图暴漏给客户端。

三、接口的实际作用

1. 工厂设计模式Factory

即降低耦合度 :A -> B ->C

package com.joeaaa.demo07;

/*
* 使用工厂设计模式,降低耦合度
*/
interface Fruit{
    public void eat();
}

class Apple implements Fruit{
    @Override
    public void eat() {
        System.out.println("eat apple");
    }
}

class Orange implements Fruit{
    @Override
    public void eat() {
        System.out.println("eat orange");
    }
}

class Factory {
    public static Fruit getInstance(String className) {// 使用static由类名称调用方法
        if ("apple".equals(className)) {
            return new Apple();
        }
        if ("orange".equals(className)) {
            return new Apple();
        }
        return null;
    }
}

public class ImplementsFactoryTest {
    public static void main(String[] args) {
        Fruit fruit = Factory.getInstance(args[0]);
        assert fruit != null;
        fruit.eat();
    }
}

2. 代理设计模式Proxy

package com.joeaaa.demo07;

/*
* 代理设计模式
*/

// 操作主题
interface Subject{
    public void get();
}

/*
* 执行者
*/
class RealSubject implements Subject{
    @Override
    public void get(){
        System.out.println("真实业务主题");
    }
}

/*
* 代理者
*/
class ProxySubject implements Subject{
    private Subject sub = null;
    public ProxySubject(Subject sub){
        this.sub = sub;
    }
    public void prepare(){
        System.out.println("代理操作:准备");
    }
    public void destroy(){
        System.out.println("代理操作:收尾");
    }
    @Override
    public void get(){
        this.prepare();
        this.sub.get();
        this.destroy();
    }
}

public class ImplementsProxyTest {
    public static void main(String[] args) {
        Subject sub = new ProxySubject(new RealSubject());
        sub.get();
    }
}
代理操作:准备
真实业务主题
代理操作:收尾

四、抽象类和接口的区别

区别抽象类接口
关键字abstract classinterface
组成常量、变量、抽象方法、普通方法、构造方法全局常量、抽象方法
权限可使用各种权限只能public
关系一个抽象类可以实现多个接口接口不能继承抽象类,可以继承多个接口
使用1子类使用extends继承抽象类子类使用implements实现接口
使用2抽象类和接口的对象都是利用对象的多态性向上转型,进行接口或抽象类的实例化同左
设计模式模版设计模式工厂设计模式、代理设计模式
局限一个子类只能继承一个抽象类一个子类可以实现多个接口

总结,由于抽象类具有缺点:一个子类只能继承一个抽象类,存在单继承的局限。因此当遇到接口、抽象类都可以用时,优先考虑接口。