抽象类
    包含抽象方法的类,用abstract修饰
    抽象方法:只有方法声明,没有方法体的方法,用abstract修饰
    当需要定义一个方法,却不明确方法的具体实现时,可以将方法定义为abstract,具体实现延迟到子类,子类中必须重写该方法。
    例如:public abstract void eat();

    特点:
    1.必须用abstract修饰
    1)修饰符 abstract 类名{}
    2)修饰符 abstract 返回类型 方法名{}
    2.抽象类不能被实例化,只能由具体的子类实例化,创建子类对象
    3.抽象类子类的两个选择:
    1)重写父类的所有抽象方法
    2)定义成抽象类
    4.成员变量
    1)可以有普通的成员变量
    2)也可以有成员常量
    5.成员方法
    1)可以有普通方法,也可以有抽象方法
    2)抽象类不一定有抽象方法,有抽象方法的类一定是抽象类(或接口)
    6.像普通类一样有构造方法,可以重载。

    优点:定义一个抽象类类型的引用P,可以通过P引用子类所实现的抽象方法。
    还有一个优点就是,如果我们没有使用抽象类,那么子类可以不重写父类的方法,而使用抽象类普通类必须实现父类的所有抽象方法。
    接口
    接口技术用于描述类具有什么功能,但是不给出具体实现,类要遵从接口描述的统一规则进行定义,所以接口是对外提供的一组规则、标准。
    接口用关键字interface表示
    格式:interface{}
    类实现接口用implements表示
    格式:class 类名 implements 接口名{}
    接口没有成员变量,只有公有的、静态的常量。
    接口不能实例化,也没有需要初始化的成员,没有构造方法。
    接口是特殊的抽象类,里面全是抽象方法,没有普通方法
    接口中定义的变量会默认加上public abstract
    1.接口不能实例化,需要创建其子类对象来完成实例化操作,即接口的多态。
    2.接口的子类
    1)如果是普通类,则必须重写接口中所有的抽象方法
    2)如果是抽象类则不用重写接口中的抽象方法
    3.接口和类的关系
    1)类与类之间
    继承关系只能单继承,不能多继承,可以多层继承
    2)类与接口之间
    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。
    3)接口与接口之间
    继承关系,可以单继承,也可以多继承
    4)对于一个类来讲,它的父类(继承的关系)中定义的都是:共性内容
    5)对于一个类来讲,它的接口(实现的关系)中定义的都是:扩展内容