Java枚举和注解

1.枚举——enum

(1)什么情况使用枚举
①类的对象是有限个的时候,建议使用枚举
②比如:
1)星期:星期一……星期日
2)订单状态:待支付,已取消
3)支付方式:支付宝 微信 银联
4)线程状态:创建 就绪 运行 阻塞 死亡
5)季节:春天 夏天 秋天 冬天
(2)JDK5之前 ⾃定义枚举类
①私有化 final修饰属性
②在构造器⾥初始化属性值 并且构造器是私有化
③对外提供固定的⼏个枚举对象 public static final修饰
(3)JDK6之后
①通过enum 关键字去定义枚举类
②枚举类对象 需要放在第⼀⾏定义
③构造函数默认是private修饰
④枚举类的所有实例必须在枚举类中显式列出(, 分隔; 结尾)。
⑤列出的实例系统会⾃动添加public static final 修饰
⑥必须在枚举类的第⼀⾏声明枚举类对象
(4)JDK 1.5 中可以在switch 表达式中使⽤Enum定义的枚举类的对象作为表达式, case ⼦句可以直接使⽤枚举值的名字, ⽆需添加枚举类作为限定
(5)enum常用方法
values	返回枚举类型的对象数组,该方法可以很方便的遍历所有的枚举值

valueOf(String str)	可以把一个字符串转为对应的枚举类对象,要求字符串必须是枚举类对象的“名字”,如不是,会有运行时异常IIIlegalArgumentException

toString()	返回当前枚举类对象常量的名称
(6)enum实现接口
①情况一:实现接口,在enum类中实现抽象方法
②情况二:让枚举类的对象分别实现接口中的抽象方法
1)格式:
ONE( “one” ){
	@Override
	public  void  show( ){
	}
},
TWO( “two” ){
	@Override
	public  void  show( ){
	}
},

2.注解——Annotation

(1)从JDK 5.0 开始, Java 增加了对元数据(MetaData) 的⽀持,也就是Annotation(注解)
(2)Annotation 其实就是代码⾥的特殊标记, 这些标记可以在编译、类加载、运⾏时被读取, 并执⾏相应的处理
(3)Annotation 可以像修饰符⼀样被使⽤,可⽤于修饰包,类,构造器,⽅法,成员变量,参数,局部变量的声明
(4)框架都是基于注解的框架 = 注解 + 反射 + 设计模式
(5)注解的理解

在编译时进行格式检查

(6)常见的注解
①@Override——限定重写父类方法,该注解只能用于方法
②@Deprecated——用于表示所修饰的元素(类,方法等)已过时,通常时因为所修饰的结构危险或存在更好的选择
③@SuppressWarnings——抑制编译器警告
1)SuppressWarnings中的属性介绍以及属性说明
all	抑制所有警告

boxing	抑制与封装/拆装作业相关的警告

cast	抑制与强制转型作业相关的警告

dep-ann	抑制与淘汰注释相关的警告

deprecation	抑制与淘汰的相关警告

fallthrough	抑制与switch陈述式中遗漏break相关的警告

finally	抑制与未传回finally区块相关的警告

hiding	抑制与隐藏变数的区域变数相关的警告

incomplete-switch	抑制与switch陈述式(enum case)中遗漏项目相关的警告

javadoc	抑制与javadoc相关的警告

nls	抑制与非nls字串文字相关的警告

null	抑制与空值分析相关的警告

rawtypes	抑制与使用raw类型相关的警告

resource	抑制与使用closeable类型的资源相关的警告

restriction	抑制与使用不建议或静止参照相关的警告

serial	抑制与可序列化的类别遗漏		serialVersiouUID栏位相关相关的警告

static-access	抑制与静态存取不正确相关的警告

static-method	抑制与可能宣告为static的方法相关的警告

super	抑制与置换方法相关但不含super的方法相关的警告

synthetic-access	抑制与内部类别的存取未最佳化相关的警告

sync-override	抑制因为置换同步方法而遗漏同步化的警告

unchecked	抑制与未检查的作业相关的警告

unqualified-field-access	抑制与栏位存取不合格相关的警告

unused	抑制与未用的程式码及停用的程式码相关的警告
(7)自定义注解
①⾃定义注解⾃动继承了java.lang.annotation.Annotation接⼝
②定义新的Annotation 类型使用@interface关键字
③Annotation的成员变量在Annotation定义中以⽆参数⽅法的形式来声明。其⽅法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能是⼋种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组。
④可以在定义Annotation的成员变量时为其指定初始值, 指定成员变量的初始值可使⽤default关键字。String value () default “张三”;
⑤如果只有⼀个参数成员,建议使⽤参数名为value
⑥如果定义的注解含有配置参数,那么使⽤时必须指定参数值,除⾮它有默认值。格式是“参数名=参数值” 如果只有⼀个参数成员,且名称为value,可以省略“value=”
⑦自定义注解必须配上注解的信息处理流程才有意义
(8)元注解
①JDK的元Annotation用于修饰其他Annotation 定义
②JDK5.0提供了4个标准的meta-annotation类型,分别是:Retention、Target、Documented、Inherited
③Retention
1)只能⽤于修饰⼀个Annotation定义, ⽤于指定该Annotation 的⽣命周期
2)@Rentention包含⼀个RetentionPolicy类型的成员变量, 使⽤@Rentention时必须为该value 成员变量指定值:
3)RetentionPolicy.SOURCE:在源⽂件中有效(即源⽂件保留),编译器直接丢弃这种策略的注释
4)RetentionPolicy.CLASS:在class⽂件中有效(即class保留),当运⾏Java 程序时, JVM 不会保留注解。这是默认值
5)RetentionPolicy.RUNTIME:在运⾏时有效(即运⾏时保留),当运⾏Java 程序时, JVM 会保留注释。程序可以通过反射获取该注释

在这里插入图片描述

④Target
1)⽤于修饰Annotation 定义, ⽤于指定被修饰的Annotation 能⽤于修饰哪些程序元素。
2)@Target 也包含⼀个名为value 的成员变量
CONSTRUCTOR	用于描述构造器	
PACKAGE	用于	描述包
FIFLD	用于描述域
PARAMETER	用于描述参数
LOCAL_VARIABLE	用于描述局部变量	
TYPE	用于描述类、接口(包括注解类型)或enum声明
METHOD	用于描述方法		
⑤Documented
1)⽤于指定被该元Annotation 修饰的Annotation 类将被javadoc⼯具提取成⽂档
2)默认情况下,javadoc是不包括注解的。
3)定义为Documented的注解必须设置Retention值为RUNTIME
⑥Inherited
1)被它修饰的Annotation 将具有继承性。
2)如果某个类使⽤了被@Inherited 修饰的Annotation, 则其⼦类将⾃动具有该注解。
3)如果把标有@Inherited注解的⾃定义的注解标注在类级别上,⼦类则可以继承⽗类类级别的注解

3.Lambda表达式

(1)Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可传递的代码
(2)⽤它可以写出更简洁、更灵活的代码。作为⼀种更紧凑的代码⻛格,使Java的语⾔表达能⼒得到了提升。
(3)函数式接口Lambda表达式的省略写法
①函数式接口:当借口中,只有一个抽象方法的时候,那么这个接口就是函数式接口
②如果不是函数式接口,就不能用lambda表达式
(匿名内部类被重写方法的形参列表)->{ 重写方法 }
③参数类型可以不写
④如果只有⼀个参数,参数类型可以省略,同时()也可以省略
⑤如果Lambda表达式的⽅法块中代码只有⼀⾏,可以省略⼤括号
⑥在条件三的基础上,如果这⾏代码是return语句,必须省略return。
//之前写法 
Runnable run =new Runnable() {
 @Override public void run() {
	 System.out.println("我是run") 
}
};
//lambda Runnable 
run2 =()-> System.out.println("我是run");
//如果只有⼀个参数 ()括号可以省略
Consumer consumer =num -> System.out.println(num);
//之前写法
Comparator comparator =new Comparator() {
 @Override 
public int compare(Integer o1, Integer o2) {
	 return Integer.compare(o1,o2 ); 
}
 };
//lambda 如果只有⼀条返回语句 那么return 必须要简写
Comparator comparator1 =(o1, o2) -> Integer.compare(o1,o2);
//⽅法引⽤
Comparator comparator3 =Integer::compareTo;
(4)四大核心函数接口

在这里插入图片描述
在这里插入图片描述

(5)方法引用
①⽅法引⽤就是Lambda表达式,也就是函数式接⼝的⼀个实例,通过⽅法的名字来指向⼀个⽅法
②要求:实现接⼝的抽象⽅法的参数列表和返回值类型,必须与⽅法引⽤的⽅法的参数列表和返回值类型保持⼀致!
③格式:使⽤操作符“::” 将类(或对象) 与⽅法名分隔开来。
④当要传递给Lambda体的操作,已经有实现的⽅法了,可以使⽤⽅法引⽤
1)对象::实例⽅法名
2)类::静态⽅法名
3)类::实例⽅法名
//⽅法引⽤ 
public static void main(String[] args) {
 	// PrintStream printStream= System.out; 
	// Consumer consumer = printStream::println;
	 // consumer.accept("张三"); 
	//当要传递给Lambda体的操作,已经有实现的⽅法了,可以使⽤⽅法引⽤
	 Consumer<String>  consumer =Test8::show;
	consumer.accept("张三"); 
	show("张三");
 } 
public static void show(String name){ 
	System.out.println(name);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值