代码块 【掌握】
什么是代码块
就是使用一对大括号包裹起来的代码
{}

Java中的代码块分类(只有这4种)
    局部代码块
    构造代码块
    静态代码块
    同步代码块(多线程讲解)


每种代码块的使用
    局部代码块
        格式:
            {

            }
        位置:位于方法中

        特点:定义的变量只能代码块中使用,出了大括号就无法使用

        作用:就是限制变量的作用域,让变量使用完及早释放,节省内存

    构造代码块
        格式:
            {

            }

        位置:位于类中方法外

        特点:每一次调用构造方法的时候,都会执行一次构造代码块,而且是先执行
             本类构造代码块先于本类构造方法执行

        作用:抽取多个构造方法中的共性代码块

    静态代码块
        格式:
            static{

            }

        位置:类中方法外

        特点:随着类的加载而执行,执行时机早  -- 验证一个类是否被加载,什么时候加载
             类的加载只会加载一次,静态代码块也只会执行一次 --一次性的操作,比如说读取配置文件

             先于构造代码块执行
             先于本类的main方法执行

        作用:执行一些很早且一次性的操作,比如一些初始化操作,读取配置文件,加载数据库驱动等

接口 【掌握】
什么是接口
就是使用interface关键字定义的一种特殊的类
它比抽象类更加抽象,因为其中的方法只能是抽象方法(JDK8以前)

 接口的好处
    1、定义规则
    2、提高程序的扩展性

接口定义格式
    public interface 接口名 {

    }
接口使用格式
    1、类实现该接口
        public class 类名 implements 接口名 {

        }

    2、接口继承接口


接口的特点
    1、接口不能创建对象(实例化)
    2、类去实现接口的时候,要么重写(实现)其中所有的抽象方法,要么这个类定义为抽象类


接口的成员的特点
    1、变量
        成员变量:不能有
        常量:可以有,有默认修饰符:public static final

    2、构造方法
        没有构造方法

        构造方法的作用:
            (1)创建对象(成员变量赋值)
            (2)子类构造方法调用

    3、成员方法
        抽象方法:可以有,有默认修饰符:public abstract
        非抽象方法:可以有(JDK8及其之后)



 接口的升级(接口新特性)
    默认方法(JDK8)
        格式:
            public default 返回值类型 方法名(参数列表){

            }

        特点
            1、可以被实现类所继承
            2、不要求强制重写,也可以重写

        作用
            解决接口的升级问题

    静态方法(JDK8)
        格式:
            public static 返回值类型 方法名(参数列表){

            }

        特点
            1、不能被实现类所继承,不能创建实现类对象的方法调用,也不能通过实现类类名.方式调用
            2、只能通过接口名.的方式进行调用

        作用
            解决接口的升级问题

    私有方法(JDK9)
        格式:
            // 私有默认方法
            private 返回值类型 方法名(参数列表){

            }

            // 私有静态方法
            private static 返回值类型 方法名(参数列表){

            }

        特点
            1、不能被实现类继承,也不能为外类使用
            2、只能通过在接口内部通过非抽象的方法(默认、静态和私有方法)进行调用

        作用
            抽取接口内部默认方法和静态方法的共性代码

    注:
        接口的升级,只是针对方法进行的,对成员变量和构造方法没有改变
        这些方法都是非抽象方法,有方法体

        以后我们在接口主要还是定义抽象的方法,极少定义非抽象方法
        但是我们在使用的过程中,可能会使用JDK提供的一些接口,其中定义这些类型的非抽象方法
        我们只要会使用这些方法即可。

类和接口之间的关系
    类和类之间
        extends,继承关系,只能单继承,不支持多继承,可以多层继承
    类和接口之间
        implements,实现关系,可以单实现,可以多实现,可以多层实现
        一个类可以在继承一个类的同时,实现多个接口
        class A extends B implments C,D {

        }
    接口和接口之间
        extends,继承关系,可以单继承,多继承和多层继承
接口和抽象类的区别
1、定义方式不同
接口:interface关键字定义的
抽象类:abstract class关键字定义的

2、类的成员不同
接口:
没有成员变量,可以有常量,常量有默认修饰的
没有构造方法
只能有抽象方法(JDK8以前)抽象方法有默认修饰符的,
从JDK8以及之后也可以定义非抽象方法
但是其非抽象方法只能定义成三种(默认、静态、私有)
抽象类
可以有成员变量,可以有常量,但是常量没有默认修饰符,必须自己手动加上final关键字
有构造方法
可以有抽象方法,也可以有非抽象方法,不要求修饰符一定要使用默认、静态、私有来修饰

3、和类之间的关系不同
接口:
类实现接口,实现关系,使用implements关键字

抽象类
类继承抽象类,继承关系,使用extends关键字

4、设计思路不同
接口:
定义规则(抽象方法就是规则)
提高程序扩展性(实现可插拔)

也是可以对多个类的共性向上抽取的,但是只能抽取方法,不能抽象成员变量

抽象类
当做父类来使用,可以给子类继承一部分方法,也可以定义抽象方法,让子类自己实现

可以对多个类的共性向上抽取,但是它可以抽取共性方法和成员变量

进行描述笔记本类,实现笔记本使用USB鼠标、USB键盘
USB接口,包含开启功能、关闭功能
笔记本类,包含运行功能、关机功能、使用USB设备功能
鼠标类,要实现USB接口,并具备点击的方法
键盘类,要实现USB接口,具备敲击的方法