一、注解
1、什么是注解?
注解可以简单理解为标注的解释,或者有人也称为注释。
但是因为说注释,容易和 单行注释和多行注释 混淆,所以更多人就称为注解。
把它叫做注释,是因为它有“解释说明”的作用。
例如:@Override 是一个注解,它的作用就有说明它标注的方法是一个“重写”的方法。
但是和我们之前用的“单行注释和多行注释”还有点不同。
单行注释和多行注释:给人看的,Java程序是忽略它的。
注解:既能给人看,还能被Java程序读取。所以也把注解称为代码级别的注释,相当于用代码去注释代码。
2、注解长什么样?
在Java程序中用 @开头,后面加类型名字,就是一个注解。
3、系统中的常见注解有这些?
(1)@Override:标注某个方法是一个“重写”的方法。
如果加上@Override,编译器会检测这个重写方法的格式是否满足重写的要求。
方法重写的要求:
方法名:必须相同
形参列表:必须相同
返回值类型:
基本数据类型和void:必须相同
引用数据类型:<=
权限修饰符:>=
不能是private,跨包还不能是缺省的
其他的修饰符:不能是static,final。
(2)@SuppressWarnings:抑制xx警告
(3)@Deprecated:标记某个类、方法等已过时,请不要再使用了,否则可能有问题。
4、一个完整的注解应该有3个部分组成:
(1)声明注解:和类、方法等一样,需要先声明后使用
具体的声明格式,反射章节再说
(2)注解的使用(绝大多数程序员都只是使用注解)
(3)注解的读取
一个注解使用后,必须配合注解的读取,才会变的有意义,否则没有任何意义。
@Override扥系统注解,由编译器来读取了。
例如:编译器读取到某个方法上面,标记了@Override,那么就会执行对应的一段代码(这个代码的作用就是检查方法是否符合重写的要求)。
如果方法上面没有标记,那么就会执行另一段代码(这个代码的作用就检查方法是否符合xx的要求)。
public class TestAnnotation {
public static void main(String[] args) {
//日期
Date date = new Date(2021,8,17);
System.out.println(date);
//Sat Sep 17 00:00:00 CST 3921
Date date2 = new Date(2021-1900,8-1,17);
System.out.println(date2);
//Tue Aug 17 00:00:00 CST 2021
}
}
//自定义注解,后面反射部分再说
@interface MyAnnotation{}
@MyAnnotation
@SuppressWarnings("unused")
class Father{
public void method(){
System.out.println("父类的方法");
}
public void print1n(){
System.out.println("父类的print1n方法");
}
public void test(int a){
System.out.println("父类的test方法");
}
public String fun(){
System.out.println("父类的fun方法");
return "";
}
public static void fang(){
System.out.println("父类的静态方法fang");
}
}
@SuppressWarnings("unused")
class Son extends Father{
@Override
public void method() {
System.out.println("子类重写父类的方法");
}
/*
//方法名不同
@Override
public void println(){
System.out.println("子类重写父类的println方法");
}
//形参列表不同
@Override
public void test(){
System.out.println("重写父类的test方法");
}
//返回值类型没有满足<=的要求
@Override
public Object fun(){
System.out.println("子类重写父类的fun方法");
return new Object();
}
//违反了修饰的要求,static不能重写
@Override
public static void fang(){
System.out.println("子类重写父类的静态方法fang");
}*/
}
二、文档注释
1、文档注释以 /**开头,而多行注释以/*开头,结果都一样。
* 文档注释的作用除了给人看以外,可以给 “javadoc.exe”程序工具读取,并生成API文档。
2、先在程序中编写文档注释,然后用IDEA的Tools菜单下-> Generate JavaDoc...
生成API文档。
需要指定:
(1)生成API的代码范围,是整个工程,还是模块,还得单独某个文件
(2)生成API文档的存储路径
(3)设置一下字符编码的参数
Locale语言环境可以选项:zh_CN
-encoding utf8 -charset utf8 -docencoding utf8
3、要求
@param表示方法的形参,有形参就写,没有形参就不写,有几个形参写几个@param。
@param 形参名 形参数据类型 形参的说明
@return表示方法的返回值信息,方法的返回值类型是void,就不写,不是void就需要写
@return 返回值类型 说明信息
@throws或@exception 表示方法执行过程中可能发生的异常,有就写,没有就不写
@throws或@exception 异常类型 说明信息
上面三个是用在方法上的。
其他的:
@author表示作者
@since表示从哪个版本开始
@see另请参阅
*/
/**
* 文档注释演示
*
* @author Irene
* @since 1.8
* @version 1.0
*/
public class TestJavaDoc {
/**
* 这是Java的主方法,是Java程序的入口
* @param args String[] 命令行参数,在用java命令运行时,使用java 主类名 参数值1 参数值2 ...的格式传入实参
*/
public static void main(String[] args) {
System.out.println("hello javadoc");
}
/**
* 求两个整数相除
* @param a int 被除数
* @param b int 除数
* @return int 商,只保留整数部分
* @throws ArithmeticException 当除数b为0时,就会发生算术异常
*/
public int divide(int a, int b) throws ArithmeticException{
return a/b;
}
}
三、JUnit
1、简单介绍
它是第三方的一个框架,用来编写单元测试。
程序员自测一般称为白盒测试,相当于盒子是透明的,因为程序员对自己写的代码是清楚,然后看它的功能等要求是否满足。
测试人员测试一般称为黑盒测试,相当于盒子是密封不可见的,因为测试人员并不清楚你的代码如何实现,他是照着需求文档,设计文档等文档进行测试,
测试功能需求,安全需求,性能瓶颈等方面,并把结果反馈给开发人员。
开发人员在公司当做主要沟通的人:
(1)产品经理及其团队
(2)自己的开发团队
(3)测试团队
2、JUnit如何使用?
第一步:因为JUnit是第三方的框架,所以需要在咱们的项目中引入对应的库(jar)
有网,可以直接从Maven仓库中直接下载
断网,可能需要通过本地的方式引入。
当我们使用@Test等JUnit中的一些注解时,会提示我们需要引入相对应的库,单击它下载即可。
默认下载到C盘 Maven仓库中。
第二步:
可以在需要测试的方法上面加@Test注解,然后就可以运行这个方法
要求:
(1)你自己的同一个包下面,不能有叫做Test的类,强烈建议
(2)包含测试方法的类必须是public的
(3)包含测试方法的类必须是有无参构造的
Test class should have exactly one public zero-argument constructor
(4)测试方法本身必须是public,void,无参的
Method test should have no parameters
Method test() should be void
Method test() should be public
为什么?因为JUnit的代码和我们写的代码不是一个包,如果我们测试类和测试方法不是公共的,
那么JUnit就无法创建我们测试类的对象,调用测试方法,因为跨包不可见。
因为JUnit是通过“反射”来创建测试类的对象,并且是用无参构造来创建对象,所以我们必须提供无参构造。
因为JUnit只是负责运行我们的测试方法,不会主动给我们的测试方法传参数和处理返回值,所以测试方法只能是无参和无返回值的。
(5)标记@Test的测试方法,不能是静态的
Method test() should not be static
3、除了@Test,还有一些其他注解
@BeforeClass:用在静态方法上,并且该方法只运行一次,在所有 测试方法之前运行
@AfterClass:用在静态方法上,并且该方法只运行一次,在所有 测试方法之后运行
@Before:和@Test一样用在非静态方法上,在每一个@Test的方法前运行
@After:和@Test一样用在非静态方法上,在每一个@Test的方法后运行
4、运行JUnit的程序,如果是在类上面单击运行按钮,那么所有测试方法都会运行。
如果是单击某个@Test方法的运行按钮,只运行这一个测试方法。
5、JUnit的@Test方法和main方法是有区别
(1)默认情况下,@Test不支持键盘输入
需要在IDEA的配置文件中,加一句参数设置,才能支持键盘输入
方式一:Help菜单-->Edit Custom VM Options...-->如果第一次单击这个,会询问是否创建这个,
相当于在C盘的C:\Users\final(当前操作系统登录的用户名)\.IntelliJIdea2019.2\config下生成一个配置文件idea64.exe.vmoptions
在配置文件最后新的一行加
-Deditable.java.test.console=true
配置完成之后,重启IDEA
方式二:如果C盘的C:\Users\final(当前操作系统登录的用户名)\.IntelliJIdea2019.2\config下没有配置文件idea64.exe.vmoptions,
也可以直接找到IDEA安装目录下的bin目录(D:\ProgramFiles\JetBrains\IntelliJ_IDEA_2019.2.3\bin)中的idea64.exe.vmoptions文件,
在配置文件最后新的一行加
-Deditable.java.test.console=true
配置完成之后,重启IDEA
注意,第二种方式,仅限于C判断没有idea64.exe.vmoptions的才有用,否则不起作用。
建议,软件的配置文件请用Notepad++软件打开进行设置,某些其他软件打开配置文件修改后会修改文件编码或给文件加(BOM头等信息)导致软件启动错误。
(2)@Test对多线程的支持不同(后面多线程再说)
public class TestJUnit {
@BeforeClass
public static void beforeClassTest(){
System.out.println("start");
}
@AfterClass
public static void afterClassTest(){
System.out.println("end");
}
@Before
public void before(){
System.out.println("before");
}
@After
public void after(){
System.out.println("after");
}
@Test
public void test1(){
System.out.println("test1");
}
@Test
public void test2(){
System.out.println("test2");
}
@Test
public void test3(){
System.out.println("test3");
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = input.nextInt();
System.out.println("num = " + num);
}
}