注解、泛型、枚举、Lambda表达式、JUnit单元测试
注解
1、JDK 1.5之后新特性2、对元素进行说明(包、类、字段、方法、局部变量,方法参数)
- 注解与注释的区别
注解:用特定格式名称说明程序,给计算机看的 注释: 用文字说明程序,给程序员看的
- 作用分类
1、编写文档的注解:生成Apidoc文档(写在注释中) 2、代码分析的注解:对代码进行分析(反射) 3、编译检查的注解:进行编译检查(@override)
- 注解使用格式
@注解名称 编写文档:@since、@author、@version、@param、@return 一般都是JDK内置的,无法自定义 编译检查:@override 一般都是JDK内置的,无法自定义
- JDK内置注解
@override 检查标注的方法是否是父类(接口)的方法
@Deprecated 标注过时
@SuppressWarnings 抑制警告提示,一般用法@SuppressWarnings("all")- 自定义注解 —— 格式
元注解
public @interface 注解名称{
属性列表;
}- 自定义注解 —— 本质
接口,默认继承Annotation接口,所谓属性列表就是抽象方法- 自定义注解 —— 属性返回值的数据类型
基本数据类型 String 注解 枚举 以上类型的数组 @MyAnno(value=12,per=Sex.MAN,anno=@person,name="wt")
- 自定义注解 —— 在使用时属性赋值
1、定义属性默认值,使用关键字default,使用注解时,可以不用属性赋值
2、如果注解中只定义到一个属性,而且属性名为value,则value可以省略
3、属性的数据类型为数组时,值使用{}包裹,如果数组中只有一个值,则{}可以省略- 自定义注解 —— 元注解
元注解:用于描述注解的注解,JDK内置
@Target:描述注解作用的位置
@Retention: 描述注解被保留到哪个阶段
@Documented:描述注解是否被提取到api文档中
@Inherited:描述注解是否被子类继承- @Target
ElementType取值: TYPE:可以作用于类上 METHOD:可以作用于方法上 FIELD:可以作用于成员属性上
- @Retention
SOURCE:编译检测 CLASS:注解会保留到class字节码中,不被JVM读取 RUNTIME:注解会保留到class字节码中,被JVM读取
- 自定义注解 —— 解析
//不使用注解
//1、加载配置文件
//创建Properties对象
Properties pro = new Properties();
//加载配置文件,转化为一个流
//获取classes目录下的配置文件
ClassLoader classLoader = Person.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);
//2、获取配置文件中数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");//1、获取字节码文件对象 Class<Person> p = Person.class; Pro an = p.getAnnotation(Pro.class); //2、获取配置文件中数据 String className = an.className(); String methodName = an.methodName();
//使用注解
Person p = new Person();
//1、获取字节码文件对象
Class cls = p.getClass();
//2、获取所有方法
Method[] methods = cls.getMethods();
//3、判断方法上是否有注解
for(Method method : methods){
if(method.isAnnotationPresent(Check.class)){
try{
mothed.invoke(p)
} catch(Exception e) {
}
}
}泛型
是一种未知的数据类型,当我们定义时不知使用什么数据类型,就可以使用泛型E e:Element 元素 (这只是语义化定义,你随便定义字母都可以,A/B/C/D...,除问号)
T t:Type 类型 (这只是语义化定义,你随便定义字母都可以,A/B/C/D...,除问号)
集合大量使用泛型- 作用
灵活地将数据类型应用到不同的类、方法、接口中去,将数据类型作为参数进行传递 对于集合来说 1、无需再转数据类型 2、运行期的异常提前到编译期 3、集合存储数据类型受到限制
- 定义
// 定义一个含有泛型的类
public class GenericClass<E> {
private E name;
public E getName(){
return this.name;
}
public void setName(E name){
this.name = name;
}
}
// 定义一个含有泛型的方法
public static <E> E test(E e){
return e;
}
public <E> E test(E e){
return e;
}
// 定义一个带有泛型的接口
public interface GenericClass<E>{
public abstract void test(E e);
}- 使用
使用时才确定数据类型,如果不指定,默认就是Object类型// 含有泛型的类使用
GenericClass<String> gc = new GenericClass<String>();
String name = gc.getName();
// 含有泛型的方法使用(调用方法的时候才确定数据类型)
GenericClass.test("123");
// 含有泛型的接口使用(有2种方法)
1、继承时确定类型
public class GernericClassImpl implements GenericClass<String>{
public String test(String e){
return e;
}
}
2、创建对象时确定类型
public class GernericClassImpl<E> implements GenericClass<E>{
public E test(E e){
return e;
}
}
GernericClassImpl<String> gc = new GernericClassImpl<String>();- 通配符
用途:
1、不能用于定义类、接口,不能用于创建对象
2、只能用于方法传参和方法返回值
List<String> list1 = new ArrayList<String>();
List<Boolean> list2 = new ArrayList<Boolean>();
public void test(List<?> list){
Iterator<?> it = list.iterator();
while(it.hasNext()){
Object ob = it.next(); // 由于传入的类型要调用方法才能确定所以获取的都是Object类型
System.out.println(ob);
}
}
public List<?> test(){}高级使用: 泛型的上限限定(子类及本身) : <? extends Class> 泛型的下限限定(父类及本身) : <? super String>
JUnit单元测试
测试分为黑盒测试 和 白盒测试,JUnit 属于 白盒测试- 以前测试做法
创建2个类文件: 一个是业务类UserService 另一个是业务类对应的测试类UserServiceTest 测试类UserServiceTest主要使用main方法进行测试,由于一个类中只存在一个main方法,所以如果你要测试多个方法,测试很繁琐
- JUnit单元测试做法
步骤: 1、定义一个测试类(测试用例) 建议: 测试类包名(类的包名.test) 测试类名(类名+Test) 2、定义一个测试方法 测试方法名(test+被测试的方法名,例如:testAdd) 测试方法返回值(void) 测试方法传参(空) 3、给方法增加@Test 4、添加预言(建议不要使用打印控制台system.out.println)
- 补充
@Before : 修饰的方法会在测试方法之前会被自动执行,一般用于资源的申请 @After : 修饰的方法会在测试方法之后会被自动执行,一般用于资源的释放
枚举
枚举 和 类、接口 同级,其实枚举也是一个类,只是该类的对象给限定了(定义在第一行)枚举是JDK1.5带来的新特性- 作用
让一个类的对象是有限且固定,例如性别:不是男就是女
- 定义枚举
public enum Sex{
MALE,FEMALE;
}
public enum Sex {
MALE("男"),FEMALE("女");
private final String name;
private Sex(String name){
this.name = name;
}
public String getName() {
return name;
}
} 相关推荐
lwnylslwnyls 2020-11-06
yanzhelee 2020-10-13
guojin0 2020-10-08
佛系程序员J 2020-10-08
bluewelkin 2020-09-16
wwzaqw 2020-09-04
zhongdaowendao 2020-09-02
favouriter 2020-08-18
奎因amp华洛 2020-08-15
一青年 2020-08-13
千锋 2020-08-10
nangongyanya 2020-08-09
dongxurr 2020-08-08
明天你好 2020-08-03
kyelu 2020-08-03
Ashes 2020-08-03