一、枚举类

  • 枚举类型本质上也是一种类,只不过是这个类的对象是固定的,不能随意让用户创建

    • 在JDK1.5之前,需要程序员自己通过特殊的方式来定义枚举类型
      • 构造器加private私有化
      • 本类内部创建一组常量对象,并添加public static final修饰符
    • 在JDK1.5之后,Java支持enum关键字来快速的定义枚举类型
      • enum关键字声明
      • 构造器只允许private修饰(默认,可不写)
      • 必须在类体第一部分(第一个分号前)给出若干本类的属性,属性之间逗号隔开
1
2
3
4
5
6
7
8
9
【修饰符】 enum 枚举类名{
常量对象列表
}

【修饰符】 enum 枚举类名{
常量对象列表;

其他成员列表;
}

二、枚举注意事项

    • 常量名:枚举类的常量对象列表必须在枚举类的首行,因为是常量,所以建议大写
    • 常量:如果常量对象列表后面没有其他代码,那么;可以省略,否则不可以省略
    • 构造器:
      • 默认提供的是private的无参构造,常量对象列表不用加参数
      • 如有参构造需要手动定义,private可省略,调用有参构造的方法:常量对象名(实参列表)
    • 继承:枚举类默认继承的是java.lang.Enum类,因此不能再继承其他的类型
    • 枚举类型如有其它属性,建议这些属性也声明为final的,因为常量对象在逻辑意义上应该不可变

三、枚举类常用方法

    • String toString():Enum自定义重写了toString(),默认返回的是常量名(对象名)
    • String name():返回的是常量名(对象名)
    • int ordinal():返回常量的次序号,默认从0开始
    • 枚举类型[] values():返回该枚举类的所有的常量对象,类型为当前枚举的数组类型,是静态方法
    • 枚举类型 valueOf(String name):根据枚举常量对象名称获取枚举对象

四、接口成员

  • 接口里通常是定义一组公共方法,的定义与定义类方式相似,但是使用 interface 关键字
1
2
3
4
5
6
7
8
【修饰符】 interface 接口名{
//接口的成员列表:
// 公共的静态常量
// 公共的抽象方法
// 公共的默认方法(JDK1.8以上)
// 公共的静态方法(JDK1.8以上)
// 私有方法(JDK1.9以上)
}
  • 接口名要大写,等于常量

  • 接口的成员

    • 在JDK8之前,接口中只允许出现:
      • 公共的静态的常量:public static final(默认,可省略)
      • 公共的抽象的方法:public abstract(默认,可省略)
    • 在JDK1.8时,接口中允许声明默认方法和静态方法:
      • 公共的默认的方法:public default(public默认,可省略)
      • 公共的静态的方法:public static(public默认,可省略)
    • 在JDK1.9时,接口又增加了:
      • 私有方法
    • 除此之外,接口中不能有其他成员,因为接口中没有成员变量需要动态初始化

接口也会被编译成.class文件,但它并不是类

五、接口的实现

  • 接口不能直接创建对象,只能创建实现类的对象,接口类型的变量可以与实现类对象构成多态引用

  • 类实现接口(implements):类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似继承,格式相仿,只是关键字不同,实现使用 implements关键字,格式:【修饰符】 class 实现类 【extends 父类】 implements 接口

    • 抽象方法:如果接口的实现类是非抽象类,那么需要重写
    • 默认方法:可以重写,但重写时不需要default,它只用于在接口中表示默认方法
    • 静态方法:不能被继承也不能被重写,可以通过接口名直接调用接口的静态方法和静态常量,不能通过实现类的对象进行调用

1、接口的多实现(implements)

  • 多实现:一个类能继承一个父类,同时实现多个接口
  • 实现格式:【修饰符】 class 实现类 【extends 父类】 implements 接口1,接口2,接口3...
  • 如果抽象方法有重名的,只需要实现一次

接口类型的变量与实现类的对象之间,也可以构成多态引用

2、接口的多继承 (extends)

  • 多继承:一个接口能继承另一个或者多个接口,接口的继承也使用 extends 关键字
  • 如果抽象方法有重名的,只需要重写一次

六、接口的冲突问题

  • 当一个类既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的抽象方法重名

    • 不重写:默认保留父类(亲爹优先原则)
    • 重写调用父类:super.方法名()
    • 重写调用父接口:接口名.super.方法名()
    • 完全重写
  • 当一个类同时实现了多个父接口,而多个父接口中包含方法签名相同的默认方法

    • 重写保留其中一个:接口名.super.方法名()
    • 完全重写

七、经典接口介绍

1、java.lang.Comparable

  • Java给所有引用数据类型的大小比较,指定了一个标准接口:java.lang.Comparable
1
2
3
4
5
package java.lang;

public interface Comparable{
int compareTo(Object obj);
}
  • 步骤

    • 第一步:实现java.lang.Comparable接口,并重写方法,方法体是如何比较当前对象和指定的另一个对象的大小
    • 第二步:对象比较大小时,通过对象调用compareTo方法,根据方法的返回值决定谁大谁小
      • this对象(调用compareTo方法的对象)大于指定对象(传入compareTo()的参数对象)返回正整数
      • this对象(调用compareTo方法的对象)小于指定对象(传入compareTo()的参数对象)返回负整数
      • this对象(调用compareTo方法的对象)等于指定对象(传入compareTo()的参数对象)返回零

2、java.util.Comparator

  • JDK在设计类库之初,考虑到对外比较的情况,所以又增加了一个接口:java.util.Comparator
1
2
3
4
5
package java.util;

public interface Comparator{
int compare(Object o1,Object o2);
}
  • 步骤

    • 第一步:编写一个类,我们称之为比较器类型,实现java.util.Comparator接口,并重写方法
    • 第二步:比较大小时,通过比较器类型的对象调用compare()方法,将要比较大小的两个对象作为compare方法的实参传入,根据方法的返回值决定谁大谁小
      • o1对象大于o2返回正整数
      • o1对象小于o2返回负整数
      • o1对象等于o2返回零
    • 一、注解概述

      • 注解是可以被编译器或其他程序读取的一种注释,程序还可以根据注解的不同,做出相应的处理(从JDK5.0开始引入)
      • 注解是以@注释名在代码中存在的,还可以添加一些参数值
      • 一个完整的注解应该包含三个部分:声明、使用、读取
    • 二、三个基本注解

      • @Override:用于检测被修饰的方法为有效的重写方法
        • 修饰范围:方法
      • @Deprecated:用于表示被标记的数据已经过时,不建议使用。
        • 修饰范围:包、类、构造、属性、方法、参数、局部变量
      • @SuppressWarnings:抑制编译警告
        • 修饰范围:类、构造、属性、方法、参数、局部变量
    • 三、JUnit

    • JUnit一个回归测试框架,供Java开发人员编写单元测试之用,JUnit测试是程序员测试,即所谓白盒测试,多数Java的开发环境都已经集成了JUnit作为单元测试的工具

    • 1、Junit导入

      • 要使用JUnit,必须在项目的编译路径中必须引入JUnit的库,即相关的.class文件组成的jar包
        • 本地导入
        • maven仓库(统一管理所有第三方框架和工具组件的jar)
    • 2、Junit常用注解

      • @Test 对当前方法进行单元测试
      • @Befor(非静态) / @Beforclass(静态):在@test前运行的方法
      • @After(非静态) / @Afterclass(静态):在@test后运行的方法
    • 单元测试和main方法区别:

      • 单元测试:相对路径是当前模块
      • main方法:相对路径是当前工程
    • 3、运行@Test单元测试方法

      • JUnit4版本,要求@Test标记的方法必须满足如下要求
        • 所在的类必须是public,非抽象,包含唯一的无参构造
        • 方法本身必须是public,非抽象,非静态的,void无返回值,()无参数
    • 4、设置JUnit支持控制台输入

      • 在idea64.exe.vmoptions配置文件中加入设置:-Deditable.java.test.console=true,重启idea后生效
    • 四、元注解

      • 元注解:修饰注解的注解
        • @Target:用于描述注解的使用范围
          • 可以通过枚举类型ElementType的10个常量对象来指定
        • @Retention:用于描述注解的生命周期
          • 可以通过枚举类型RetentionPolicy的3个常量对象来指定:SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时)
        • @Documented:表明这个注解应该被 javadoc工具记录
        • @Inherited:允许子类继承父类中的注解
    • 五、自定义注解

    • 【元注解】
      【修饰符】 @interface 注解名{
          【成员列表】
      }
      
      • 自定义注解可以通过四个元注解分别说明它的声明周期,使用位置,是否被继承,是否被生成到API文档中
      • 声明注解:注解成员在注解定义中以无参数有返回值的抽象方法的形式来声明,又称为配置参数
        • 返回值类型:八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组
        • 声明格式:public 数据类型 方法名() 【default 默认值】
      • 使用注解:如果定义的注解含有抽象方法,那么使用时必须指定返回值,除非它有默认值(default关键字)
        • 使用格式:方法名 = 返回值
        • 如果只有一个抽象方法需要赋值,且方法名为value,则可以省略方法名