接口语法

1.接口是一种引用类型,可以等同看作类。修饰符 interface 接口名
2.接口中只能出现常量和抽象方法
3.接口其实是一个特殊的抽象类,特殊在接口是完全抽象的
4.接口中没有构造方法,接口也无法实例化
5.接口和接口之间可以多继承
6.一个类可以实现多个接口,这里的实现等同于继承
7.一个非抽象的类实现接口,需要将接口中所有方法实现/重写/覆盖

#java
package study1;

public interface A{
    //常量都是public static final,可省略
    public static final String sucess = "SUCCESS";
    public static final double pi = 3.14;
    byte max_value = 127;
    //接口中所有的抽象方法都是public abstract,
    public abstract void m1();
    //接口方法不能有方法体,如 void m22(){};会提示interface abstract methods cannot have body
    
    void m2();

    interface B{
        void m1();
    }
    interface C{
        void m2();
    }
    interface D{
        void m3();
    }
    interface E extends B,C,D{
        void m4();
    }
    /*
    extends只能单继承,implements可以多继承
    如果实现的接口有多个方法,必须覆盖接口中的方法。
    */
    class MyClass implements B,C{
        public void m2(){}
        public void m1(){}
    }
    class MyClass2 implements E{
        
        public void m1(){};
        public void m2(){};
        public void m3(){};
        public void m4(){};
    }
}

接口的作用

#java
package date818;

/**
 * 接口的作用:
 * 1。可以使项目分离,所有层都面向接口开发,提高开发效率
 * 2。接口是代码和代码之间的耦合度降低。变得可插拔,可以随意切换。
*  3。接口和抽象类都能完成某个功能,优先选择接口,因为接口可以多实现,多继承。并且一个类除了接口之外,还可以继承其他类
 */
public interface CustomerService {
    //定义一个推出系统的方法
    void logout();
}

package date818;
//接口实现类1
public class CustomerServierImpl implements CustomerService {
    public void logout(){
        System.out.println("成功退出系统");
    }
}

package date818;
//接口实现类2
public class CustomerServiceImpl2 implements CustomerService{
    public void logout(){
        System.out.println("hello world");
    }
}

package date818;

public class TestCustomer {
    public static void main(String[] args){
        //需要执行CustomerServiceImpl和CustomerImpl2接口实现类中的logout方法
        //以下程序面向接口调用
        CustomerService cs = new CustomerServierImpl();//多态。父类型引用指向子类型对象
        //调用
        cs.logout();
        CustomerService cs2 = new CustomerServiceImpl2();
        cs2.logout();
    }
}
#java
//定义接口
package date818;

public interface Engine {
    //所有发动机都可以通过这个接口启动
    void start();
}
//定义实现接口的类
package date818;

public class Honda implements Engine{
    public void start(){
        System.out.println("本田启动");
    }
}
package date818;

public class Ymaha implements Engine{
    public void start(){
        System.out.println("雅马哈启动");
    }
}
//定义生产汽车的类
package date818;

public class Car {
    //面向接口编程,不能将类实例化
    /**
     * 引用接口定义一个属性e,相当于
     * String name;
     * Integer age;
     * 类里定义的变量是成员变量;方法里定义的变量是局部变量。
     */
    Engine e ;//成员变量e

    Car(Engine e){
        //定义构造方法,把局部变量e赋值给成员变量
        this.e=e;
    }
    //对外提供的测试方法
    public void testEngine(){
        //成员变量e
        e.start();
    }
}
//定义测试类
package date818;

public class TestCar {
    public static void main(String[] args){
        //生产引擎
        Engine e = new Ymaha();
        //根据构造方法传入参数生产汽车
        Car c = new Car(e);
        //测试引擎
        c.testEngine();

        c.e = new Honda();//已经定义了一个实例,直接对实例的参数修改即可
        c.testEngine();
    }
}

雅马哈启动
本田启动