枚举
枚举是用来描述几个固定的值。在java中枚举是一种特殊的类,一个枚举类包含多个枚举项,而枚举项就是枚举类的对象。
//定义枚举类,表示星期,一共有7天
public enum Week {
//下面是7个枚举项,表示七个Week对象
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
public enum Week {
//枚举项,其实就是枚举类的对象
SUNDAY("星期日"), //等价于 new Week("星期日");
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五"),
SATURDAY("星期六");
//给外部提供几个固定的对象,使用枚举来简化对象的写法。
// public static final Week SUNDAY=new Week("星期一");
// public static final Week MONDAY=new Week("星期二");
// public static final Week TUESDAY=new Week("星期三");
// public static final Week WEDNESDAY=new Week("星期四");
// public static final Week THURSDAY=new Week("星期五");
// public static final Week FRIDAY=new Week("星期六");
// public static final Week SATURDAY=new Week("星期日");
private String name;
//构造方法必须私有
private Week(String name) {
this.name = name;
}
public void show(){
System.out.println("今天是星期"+name);
}
}
Enum的常用方法
public String name()
获取枚举项的名称
public int ordinal()
获取枚举项的索引
public int compareTo(E o)
比较枚举项的顺序
public String toString()
把枚举项转换为字符串(枚举项的名称)
public E[] values()
获取所有的枚举项
public static T valueOf(Class<T> enumType, String name)
获取指定名称的枚举项
注解
注解用来对代码添加一些额外的描述信息。 可以使用在类上、方法上、变量上等,对代码的本身没有影响。
内置的注解
@Override : 用来标注方法是复写父类的方法
@Deprecated: 用来标注一个方法过时了
@SuppressWarnings(value = "all"): 压制警告
元注解的
元注解是用来描述注解的注解。如描述注解的使用位置、描述注解的存活时间。
@Retention(RetentionPolicy.RUNTIME) //存活时间,是在运行时期有效.
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
注解的定义格式
自定义注解时,需要加上元注解进行对注解的使用位置和存活时间做一些限定。
public @interface 注解名称{
//属性的格式:
//属性的数据类型可以是: 基本数据类型、String、注解、枚举、各类型的数组.
public 数据类型 属性名() default 默认值;
}
- 按照格式定义一个注解
public @interface Anno {
//属性名是value,使用注解的时候,可以省略属性名value。
public String value();
}
- 把上面定义的
@Anno
注解使用在类上
@Anno("xiaoming") // 等价于: @Anno(value="xiaoming")
public class Demo2 {
public static void main(String[] args) {
System.out.println("hello");
}
}
注解案例
@Retention(RetentionPolicy.RUNTIME) //存活时间,是在运行时期有效.
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
public @interface Anno {
//属性
public String classname(); //类名
public String methodname(); //方法名
}
把@Anno注解添加在类上,用来描述要执行的类和方法。通过反射获取类上的注解提供的信息。
@Anno(classname = "com.itheima.demo2.Cat",methodname = "play")
public class Demo2 {
public static void main(String[] args) throws Exception{
//获取Demo2的字节码
Class<Demo2> clazz = Demo2.class;
//获取类上的注解
Anno anno = clazz.getAnnotation(Anno.class);
//获取注解的属性值
String classname = anno.classname(); //类名
String methodname = anno.methodname(); //方法名
//通过反射获取要执行的类的字节码
Class<?> cls = Class.forName(classname);
//创建要执行的类的对象
Object obj = cls.getConstructor().newInstance();
//获取要执行的方法
Method m = cls.getMethod(methodname);
m.invoke(obj);
}
}
注解的使用流程
Junit测试
Junit用来对我们在实际开发过程中写的代码进行测试。为了保证项目的代码没有问题,我们会写一点代码然后测试一些,我们把它叫做单元测试。Junit就是一个测试的工具,它可以脱离main方法执行。
Junit基本使用
在方法上加@Test
注解,方法就可以独立运行。我们根据运行的结果是红色还是绿色来判断是失败或者成功。
@Befor
public void show1(){
//运行在@Test的方法之前
}
@Test
public void show2(){
//需要测试的代码
}
@After
public void show3(){
//运行在@Test的方法之后
}
日志
日志用来记录程序运行过程中的数据(类似于行车记录仪),如果程序执行过程中出现了什么问题,可以根据日志信息进行查找。
日志和输出语句的区别
共同点:都可以记录程序中运行的数据
不同点:
输出语句:在主线程中记录,记录的数据比较单一
日志:在子线程中记录数据,记录的数据比较丰富,还可以对数据划分等级。
日志的意义:
记录程序在运行中的各种数据,把日志写好,有助于调试程序。
日志等级
DEBUG < INFO < WARN < ERROR < FATAL
DEBUG: 用来记录一般的信息
INFO: 记录比较重要的信息
WARN: 记录可能会有问题的信息
ERROR: 可以记录一些可能会出现错误的数据
FATAL: 程序出现了严重的错误,记录错误信息
输出源
ConsoleAppender: 往控制台输出
fileAppender: 往文件中输出
输出模式
Patternlayout: 可以灵活控制输出哪些数据信息
Simplelayout: 比较简单的输出(级别、日志信息)
TTCClayout: 比较简单的输出(时间、线程、级别、日志信息)
log4j的使用步骤
1.导包:自己到资料中找3个jar文件
2.把配置文件(log4j.properties),复制到src目录下
3.创建Logger对象
Logger logger = LoggerFactory.getLogger(Demo3.class);
4.在需要位置使用Logger的方法进行记录
logger.error("error等级的日志");
logger.warn("warn等级的日志");
logger.info("info等级的日志");
logger.debug("debug等级的日志");
logger.fatal("fatal等级的日志");
ger logger = LoggerFactory.getLogger(Demo3.class);
4.在需要位置使用Logger的方法进行记录
logger.error(“error等级的日志”);
logger.warn(“warn等级的日志”);
logger.info(“info等级的日志”);
logger.debug(“debug等级的日志”);
logger.fatal(“fatal等级的日志”);