Java基础——接口 (interface)

接口的使用

  1. 接口使用interface来定义。

  2. 如何定义接口,定义接口中的成员
    2.1 jdk7及以前,只能定义全局常量和抽象方法
    全局常量:public static final… 可省略
    抽象方法:public abstract … 可省略

    2.2 jdk8: 除了定义全局常量和抽象方法之外,还可以定义静态方法,默认方法

  3. 接口中不能定义构造器,意味着接口不可以实例化。(抽象类可以定义构造器,但是不能实例化)

  4. Java开发中,接口是通过类来实现(implements)接口。
    如果实现类实现了接口中的所有方法,那么此实现类可以实例化,否则,该类还是一个抽象类。

  5. Java类可以实现多个接口 -> 弥补了Java类单继承的局限性
    格式:class A extends B implements C,D

  6. 接口与接口直接可以继承,而且可以多继承.

  7. 接口的具体使用,体现了多态性

  8. 接口,实际上可以看做成一种规范

  9. 开发中体会面向接口编程
    10.创建接口的匿名实现类

package com.example;

public class InterfaceTest {
    
    
    public static void main(String[] args) {
    
    
        Plane p = new Plane();
        p.fly();
    }
}

interface Flyable {
    
    
    //全局常量
    public static final int MAX_SPEED = 7900;//第一宇宙速度
    int MIN_SPEED = 1;

    //抽象方法
    public abstract void fly();

    void stop();

}

interface Attackable {
    
    
    void attack();
}

class Plane implements Flyable {
    
    
    @Override
    public void fly() {
    
    

    }

    @Override
    public void stop() {
    
    

    }
}

abstract class Rocket implements Flyable, Attackable {
    
    
    @Override
    public void fly() {
    
    

    }
}

interface AA{
    
    

}

interface BB{
    
    

}

interface CC extends AA, BB{
    
    

}

多态,规范

package com.example;

public class USBTest {
    
    
    public static void main(String[] args) {
    
    
        Computer c = new Computer();
        //1. 创建接口的非匿名实现类的非匿名对象
        Flash f = new Flash();
        c.transferData(f);

        //2. 创建接口的非匿名实现类的匿名对象
        c.transferData(new Printer());

        //3. 创建接口的匿名实现类的非匿名对象

        USB p = new USB() {
    
    
            @Override
            public void start() {
    
    
                System.out.println("p start");
            }

            @Override
            public void stop() {
    
    
                System.out.println("p stop");
            }
        };
        c.transferData(p);

        //创建接口的匿名实现类的匿名对象
        c.transferData(new USB() {
    
    
            @Override
            public void start() {
    
    
                System.out.println("start");
            }

            @Override
            public void stop() {
    
    
                System.out.println("stop");
            }
        });
    }

}

interface USB {
    
    
    void start();

    void stop();
}

class Flash implements USB {
    
    
    @Override
    public void start() {
    
    
        System.out.println("Flash start");
    }

    @Override
    public void stop() {
    
    
        System.out.println("Flash stop");
    }
}

class Printer implements USB {
    
    
    @Override
    public void start() {
    
    
        System.out.println("Printer start");
    }

    @Override
    public void stop() {
    
    
        System.out.println("Print stop");
    }
}

class Computer{
    
    

    public void transferData(USB usb){
    
    
        usb.start();
        System.out.println("transfer data");
        usb.stop();
    }
}

jdk8 中接口的新特性,静态方法,默认方法。

public interface CompareA {
    
    
    //静态方法,public可省
    public static void method1(){
    
    
        System.out.println("compareA:北京");
    }

    //默认方法,public可省
    public default void method2(){
    
    
        System.out.println("compareB:上海");
    }

    default void method3(){
    
    
        System.out.println("compareB:上海");
    }
}

public class SubClassTest {
    
    
    public static void main(String[] args) {
    
    
        SubClass s = new SubClass();

        //s.method1();
        //1.接口中定义的静态方法,只能通过接口来调用。(为了消灭工具类)
        CompareA.method1();
        //2.通过实现类的对象,可以调用接口中的默认方法。
        //如果实现类重写了接口中的默认方法,调用时,调用的是重写以后的方法。
        s.method2();
        s.method3();
        //3. 如果子类(或实现类)继承了父类和实现的接口中声明的同名同参的方法。--> 类优先原则
        //4. 如果实现类实现了多个接口,而这些接口中定义了同名同参的默认方法。
        //那么在实现类中没有重写此方法的情况下,报错。-->接口冲突。
    }
}

class SubClass implements CompareA {
    
    

    @Override
    public void method2() {
    
    
        System.out.println("SubClass:上海");
    }
    //5. 如何在子类中调用接口中被重写的方法
    public void myMethod(){
    
    
        CompareA.super.method2();
    }
}

猜你喜欢

转载自blog.csdn.net/AmorFati1996/article/details/108721043