博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
注解、泛型、枚举、Lambda表达式、JUnit单元测试
阅读量:6674 次
发布时间:2019-06-25

本文共 4317 字,大约阅读时间需要 14 分钟。

注解

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
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
{ private E name; public E getName(){ return this.name; } public void setName(E name){ this.name = name; }}// 定义一个含有泛型的方法public static
E test(E e){ return e;}public
E test(E e){ return e;}// 定义一个带有泛型的接口public interface GenericClass
{ public abstract void test(E e);}
  • 使用
使用时才确定数据类型,如果不指定,默认就是Object类型
// 含有泛型的类使用GenericClass
gc = new GenericClass
();String name = gc.getName();// 含有泛型的方法使用(调用方法的时候才确定数据类型)GenericClass.test("123");// 含有泛型的接口使用(有2种方法)1、继承时确定类型public class GernericClassImpl implements GenericClass
{ public String test(String e){ return e; }}2、创建对象时确定类型public class GernericClassImpl
implements GenericClass
{ public E test(E e){ return e; }}GernericClassImpl
gc = new GernericClassImpl
();
  • 通配符
通配符<?> (与<E>、<T>要区分)
用途:1、不能用于定义类、接口,不能用于创建对象2、只能用于方法传参和方法返回值List
list1 = new ArrayList
();List
list2 = new ArrayList
();public void test(List
list){ Iterator
it = list.iterator(); while(it.hasNext()){ Object ob = it.next(); // 由于传入的类型要调用方法才能确定所以获取的都是Object类型 System.out.println(ob); }}public List
test(){}
高级使用:泛型的上限限定(子类及本身) : 
泛型的下限限定(父类及本身) :

JUnit单元测试

测试分为
黑盒测试
白盒测试
JUnit 属于
白盒测试
  • 以前测试做法
创建2个类文件:一个是业务类UserService另一个是业务类对应的测试类UserServiceTest测试类UserServiceTest主要使用main方法进行测试,由于一个类中只存在一个main方法,所以如果你要测试多个方法,测试很繁琐
  • JUnit单元测试做法
步骤:1、定义一个测试类(测试用例)建议:测试类包名(类的包名.test)测试类名(类名+Test)2、定义一个测试方法测试方法名(test+被测试的方法名,例如:testAdd)测试方法返回值(void)测试方法传参(空)3、给方法增加@Test4、添加预言(建议不要使用打印控制台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;    }}

转载地址:http://emgxo.baihongyu.com/

你可能感兴趣的文章
android 更新实现自己主动
查看>>
RS导出Excel交叉表角对应的列占用多列问题
查看>>
2016校招内推 -- 阿里巴巴前端 -- 四面面试经历
查看>>
SQL Server里的INTERSECT ALL
查看>>
【Xamarin开发 Android 系列 6】 Android 结构基础(上)
查看>>
PowerDesigner反projectM连接ySql没有mySql odbc驱动器
查看>>
【Xamarin开发 Android 系列 13】 应用打包部署
查看>>
flask前后台交互数据的几个思路
查看>>
HDOJ 5188 zhx and contest 贪婪+01背包
查看>>
Git介绍和基本原理
查看>>
Activity生命周期回顾
查看>>
Rust初步(五):Rust与C#性能比较
查看>>
1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解...
查看>>
What exactly is the difference between WndProc and DefaultWndProc?
查看>>
创建加密应用程序
查看>>
NYOJ 24 素数的距离问题
查看>>
Jsoup解析Html中文文档
查看>>
学习一样新东西行而有效的方法 学习捷径 一项由10个步骤组成的学习方法
查看>>
Spotlight实时监控Windows Server 2008
查看>>
linux shell “(())” 双括号运算符使用
查看>>