Java - 枚举、接口和注解
一、枚举类
枚举类型本质上也是一种类,只不过是这个类的对象是固定的,不能随意让用户创建
- 在JDK1.5之前,需要程序员自己通过特殊的方式来定义枚举类型
- 构造器加private私有化
- 本类内部创建一组常量对象,并添加public static final修饰符
- 在JDK1.5之后,Java支持enum关键字来快速的定义枚举类型
- enum关键字声明
- 构造器只允许private修饰(默认,可不写)
- 必须在类体第一部分(第一个分号前)给出若干本类的属性,属性之间逗号隔开
1 | 【修饰符】 enum 枚举类名{ |
二、枚举注意事项
- 常量名:枚举类的常量对象列表必须在枚举类的首行,因为是常量,所以建议大写
- 常量:如果常量对象列表后面没有其他代码,那么
;
可以省略,否则不可以省略 - 构造器:
- 默认提供的是private的无参构造,常量对象列表不用加参数
- 如有参构造需要手动定义,private可省略,调用有参构造的方法:
常量对象名(实参列表)
- 继承:枚举类默认继承的是java.lang.Enum类,因此不能再继承其他的类型
- 枚举类型如有其它属性,建议这些属性也声明为final的,因为常量对象在逻辑意义上应该不可变
三、枚举类常用方法
String toString()
:Enum自定义重写了toString(),默认返回的是常量名(对象名)String name()
:返回的是常量名(对象名)int ordinal()
:返回常量的次序号,默认从0开始枚举类型[] values()
:返回该枚举类的所有的常量对象,类型为当前枚举的数组类型,是静态方法枚举类型 valueOf(String name)
:根据枚举常量对象名称获取枚举对象
四、接口成员
- 接口里通常是定义一组公共方法,的定义与定义类方式相似,但是使用
interface
关键字
1 | 【修饰符】 interface 接口名{ |
接口名要大写,等于常量
接口的成员
- 在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 | package java.lang; |
步骤
- 第一步:实现java.lang.Comparable接口,并重写方法,方法体是如何比较当前对象和指定的另一个对象的大小
- 第二步:对象比较大小时,通过对象调用compareTo方法,根据方法的返回值决定谁大谁小
- this对象(调用compareTo方法的对象)大于指定对象(传入compareTo()的参数对象)返回正整数
- this对象(调用compareTo方法的对象)小于指定对象(传入compareTo()的参数对象)返回负整数
- this对象(调用compareTo方法的对象)等于指定对象(传入compareTo()的参数对象)返回零
2、java.util.Comparator
- JDK在设计类库之初,考虑到对外比较的情况,所以又增加了一个接口:
java.util.Comparator
1 | package java.util; |
步骤
- 第一步:编写一个类,我们称之为比较器类型,实现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
标记的方法必须满足如下要求
- JUnit4版本,要求
- 所在的类必须是public,非抽象,包含唯一的无参构造
- 方法本身必须是public,非抽象,非静态的,void无返回值,()无参数
4、设置JUnit支持控制台输入
- 在idea64.exe.vmoptions配置文件中加入设置:
-Deditable.java.test.console=true
,重启idea后生效
- 在idea64.exe.vmoptions配置文件中加入设置:
四、元注解
- 元注解:修饰注解的注解
- @Target:用于描述注解的使用范围
- 可以通过枚举类型ElementType的10个常量对象来指定
- @Retention:用于描述注解的生命周期
- 可以通过枚举类型RetentionPolicy的3个常量对象来指定:SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时)
- @Documented:表明这个注解应该被 javadoc工具记录
- @Inherited:允许子类继承父类中的注解
五、自定义注解
【元注解】 【修饰符】 @interface 注解名{ 【成员列表】 }
- 自定义注解可以通过四个元注解分别说明它的声明周期,使用位置,是否被继承,是否被生成到API文档中
- 声明注解:注解成员在注解定义中以无参数有返回值的抽象方法的形式来声明,又称为配置参数
- 返回值类型:八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组
- 声明格式:
public 数据类型 方法名() 【default 默认值】
- 使用注解:如果定义的注解含有抽象方法,那么使用时必须指定返回值,除非它有默认值(default关键字)
- 使用格式:
方法名 = 返回值
- 如果只有一个抽象方法需要赋值,且方法名为
value
,则可以省略方法名
- 使用格式:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 妙妙屋!