一、注解
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 3921Date 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{@Overridepublic void method() {System.out.println("子类重写父类的方法");}
/*//方法名不同@Overridepublic void println(){System.out.println("子类重写父类的println方法");}//形参列表不同@Overridepublic void test(){System.out.println("重写父类的test方法");}//返回值类型没有满足<=的要求@Overridepublic Object fun(){System.out.println("子类重写父类的fun方法");return new Object();}//违反了修饰的要求,static不能重写@Overridepublic 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 {@BeforeClasspublic static void beforeClassTest(){System.out.println("start");}@AfterClasspublic static void afterClassTest(){System.out.println("end");}@Beforepublic void before(){System.out.println("before");}@Afterpublic void after(){System.out.println("after");}@Testpublic void test1(){System.out.println("test1");}@Testpublic void test2(){System.out.println("test2");}@Testpublic void test3(){System.out.println("test3");Scanner input = new Scanner(System.in);System.out.print("请输入一个整数:");int num = input.nextInt();System.out.println("num = " + num);}
}