接口的使用

目录

1.接口的理解

2.定义接口的关键字

3.接口内部的结构说明

        1.可以声明

        2.不可以声明

4.接口与类的关系

5.格式

6.满足此关系后,说明

7.接口与接口的关系

8.接口的多态性

9.扩展


1.接口的理解

        接口本质是契约、标准、规范,就像我们的法律一样。制定好大家需要遵守。

2.定义接口的关键字

        interface

3.接口内部的结构说明

        1.可以声明

                属性:必须使用public static final修饰

                方法:jdk8之前:声明抽象方法,修饰为public abstract

public class InterfaceTest {
    public static void main(String[] args) {
        System.out.println(Flyable.MIN_SPEED);
        System.out.println(Flyable.MAX_SPEED);
    }
}
interface Flyable{
    //全局常量
    public static final int MIN_SPEED = 0;

    int MAX_SPEED = 7900;//可以省略public static final

    void fly();//方法可以省略public abstract 声明
}
interface Attack{
    public abstract void attack();
}

                           jdk8:声明为静态方法、默认方法

                           jdk8之后:声明为私有方法

public class InterfaceTest {
    public static void main(String[] args) {
        //知识点1:接口中声明的静态方法只能被接口来调用,不能使用其实现类进行调用
        //SubClass.method1();不能被调用
        CompareA.method1();

        /*知识点2:接口中声明的默认法昂发可以被实现类继承,实现类在没有重写此方法的情况下,默认调用接口声明的
        默认方法,如果实现类重写了此方法,则调用的是自己重写的方法*/
        SubClass s1 = new SubClass();
        s1.method2();

        /*知识点3:类实现了两个接口,面两个接口中自定义了同名同参数的默认方法。则实现类在没有重写此两个接口
        默认方法的情况下,会报错。 -->接口冲突
        要求:此时实现类必须要重写接口中定义的同名同参的方法。*/
        s1.method3();

        /*知识点4:子类(或实现类)继承了父类并实现了接口,父类和接口中声明了同名同参的方法。(其中,接口中的方法
        是默认方法)。默认情况下,子类(或实现类)在没有重写此方法的情况下,调用的是父类中的方法。-->类优先原则
         */
        s1.method4();
        s1.method();
    }
}
interface CompareA{
    //属性:声明为 public static abstract
    //方法:jdk8之前,只能声明抽象方法

    //jdk8中,静态方法
    public static void method1(){
        System.out.println("CompareA:北京");
    }
    //jdk8中,默认方法
    public default void method2(){
        System.out.println("CompareA:上海");
    }
    public default void method3(){
        System.out.println("CompareA:广州");
    }
    public default void method4(){
        System.out.println("CompareA:深圳");
    }
    /*jdk9新特性:定义私有方法
    protected void method5(){
        System.out.println("我是接口中定义的私有方法");
    }*/
}
class SubClass extends SuperClass implements CompareA,CompareB{
    @Override
    public void method2() {
        System.out.println("SubClass:上海");
    }
    public void method3() {
        System.out.println("SubClass:广州");
    }
    public void method4() {
        System.out.println("SubClass:深圳");
    }
    public void method(){
        //知识点5:如何在子类(或实现类)中调用父类或接口中被重写的方法
        method4();//调用自己类中的方法
        super.method4();//调用父类的
        method3();//调用自己类中的方法
        CompareA.super.method3();//调用接口CompareA中的默认方法
        CompareB.super.method3();//调用接口Compare中的默认方法
    }
}
interface CompareB{
    public default void method3(){
        System.out.println("CompareB:广州");
    }
}
class SuperClass{
    public void method4(){
        System.out.println("SuperClass:深圳");
    }
}

        2.不可以声明

                构造器、代码块等

4.接口与类的关系

        实现关系

public class InterfaceTest {
    public static void main(String[] args) {
        System.out.println(Flyable.MIN_SPEED);
        System.out.println(Flyable.MAX_SPEED);
        Bullet b1 = new Bullet();
        b1.fly();
        b1.attack();
    }
}
interface Flyable{
    //全局常量
    public static final int MIN_SPEED = 0;

    int MAX_SPEED = 7900;//可以省略public static final

    void fly();//方法可以省略public abstract 声明
}
interface Attack{
    public abstract void attack();
}

abstract class Plane implements Flyable{

}
//或       (快捷键:Alt+Enter)
class Bullet implements Flyable,Attack{

    @Override
    public void fly() {
        System.out.println("让子弹飞飞一会儿");
    }

    @Override
    public void attack() {
        System.out.println("子弹可以击穿身体");
    }
}

5.格式

        class A (extends SuperA) implements B,C{ }

        ·A相较于SuperA来讲,叫做子类

        ·A相较于B,C来讲,叫做实现类

6.满足此关系后,说明

        1.类可以有多个接口。

        2.类针对于接口的实现,一定程度上就弥补了类的单继承的局限性。

        3.类必须将实现的接口中的所有的抽象方法都进行重写(或实现),方可实例化。否则,此实现类声明必须为抽象类。

7.接口与接口的关系

        继承关系,且可以多继承

interface AA{
    void method1();
}
interface BB{
    void method2();
}
interface CC extends AA,BB{//接口可以多继承

}
class DD implements CC{

    @Override
    public void method1() {
        
    }

    @Override
    public void method2() {

    }
}

8.接口的多态性

        接口名 变量 = new 实现对象类;

public class USBTest {
    public static void main(String[] args) {
        //1.创建接口实现类的对象
        Computer computer = new Computer();
        Printer printer = new Printer();
        computer.transformData(printer);
        /*或
        Computer computer = new Computer();
        computer.transformData(new Printer());
         */
        System.out.println("-------------------");
        //2.创建接口实现类的匿名对象
        computer.transformData(new Camera());
        System.out.println("-------------------");
        //3.创建接口匿名实现类的对象
        USB usb1 = new USB(){
            public void start() {
                System.out.println("U盘开始工作");
            }
            public void stop() {
                System.out.println("U盘停止工作");
            }
        };
        computer.transformData(usb1);
        System.out.println("-------------------");
        //4.创建接口匿名实现类的匿名对象
        computer.transformData(new USB(){

            @Override
            public void start() {
                System.out.println("扫描仪开始工作");
            }

            @Override
            public void stop() {
                System.out.println("扫描仪结束工作");
            }
        });
    }
}
class Computer{
    public void transformData(USB usb){
        System.out.println("设备连接成功");
        usb.start();
        System.out.println("数据传输操作");
        usb.stop();
    }
}
//多态:USB usb = new Printer();
class Printer implements USB {

    @Override
    public void start() {
        System.out.println("打印机开始工作");
    }

    @Override
    public void stop() {
        System.out.println("打印机停止工作");
    }
}
class Camera implements USB{

    @Override
    public void start() {
        System.out.println("照相机开始工作");
    }

    @Override
    public void stop() {
        System.out.println("照相机停止工作");
    }
}
interface USB{
    public abstract void start();
    void stop();
}

9.扩展

        面试题:区分抽象类和接口

                共性:都可以声明抽象方法,都不能实例化

                不同:抽象类一定有构造器,接口没有构造器

                           类与类之间是继承关系,类与接口之之间是实现关系,接口与接口之间是多继

                           承关系

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值