枚举和注解
Posted Al_tair
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举和注解相关的知识,希望对你有一定的参考价值。
枚举和注解
大家好呀!我是小笙!我学习了韩顺平老师的类和对象的知识,收获颇丰!现在来和大家分享笔记!
枚举和注解
概念:枚举是一种特殊的类,里面只包含一组有限的特定的对象
自定义枚举
// 案例:创建春夏秋冬四个季节
public class EnumClass01
public static void main(String[] args)
System.out.println(EnumDemo.WINTER);
System.out.println(EnumDemo.SUMMER);
System.out.println(EnumDemo.AUTUMN);
System.out.println(EnumDemo.SPRING.toString());
/*
* 自定义枚举 (枚举对象名通常为大写字母)
* 1)构造器私有化 => 外部不能创建对象
* 2)去掉setXxx方法 => 外部不能修改属性
* 3)直接创建固定的对象 => 枚举的特定用法
* 4)可以使用 final static 修饰符优化 => 防止类初始化的时候加载对象
* 5)可以提供get方法,重写toString方法用来输出
*/
class EnumDemo
private String seasonName;
private String seasonFeature;
public String getSeasonFeature()
return seasonFeature;
public String getSeasonName()
return seasonName;
//构造器
private EnumDemo(String seasonName,String seasonFeature)
this.seasonName = seasonName;
this.seasonFeature = seasonFeature;
// 创建枚举对象
final static EnumDemo SPRING = new EnumDemo("春天","温暖");
final static EnumDemo SUMMER = new EnumDemo("夏天","炎热");
final static EnumDemo AUTUMN = new EnumDemo("秋天","凉爽");
final static EnumDemo WINTER = new EnumDemo("冬天","寒冷");
@Override
public String toString()
return "["+getSeasonName()+"--->"+getSeasonFeature()+"]";
enum关键字实现枚举
public class EnumClass02
public static void main(String[] args)
System.out.println(Session.AUTUMN);
/*
* 使用enum关键字来实现枚举
* 1.当我们使用enum关键字开发一个枚举类时,默认会继承Enum类 java.lang.Enum<com.Al_tair.enum_.Session>
* 反编译javap Session.class:
* final class com.Al_tair.enum_.Session extends java.lang.Enum<com.Al_tair.enum_.Session>
* public static final com.Al_tair.enum_.Session SPRING;
* public static final com.Al_tair.enum_.Session SUMMER;
* public static final com.Al_tair.enum_.Session AUTUMN;
* public static final com.Al_tair.enum_.Session WINTER;
* public static com.Al_tair.enum_.Session[] values(); // 隐藏
* public static com.Al_tair.enum_.Session valueOf(java.lang.String);
* public java.lang.String getSeasonFeature();
* public java.lang.String getSeasonName();
* public java.lang.String toString();
* static ;
*
*/
enum Session
/*
* Enum枚举类
* 1.使用关键字enum替代class
* 2.格式: 形式常量名(实参列表)
* 3.如果有多个常量对象,使用,号间隔
* 4.如果使用enum枚举,要求将定义常量对象写在最前面
* 5.
* 6.如果我们是使用无参构造器的时候,创建常量对象可以省略括号
*/
SPRING("春天","温暖"),
SUMMER("夏天","炎热"),
AUTUMN("秋天","凉爽"),
WINTER("冬天","寒冷");
private String seasonName;
private String seasonFeature;
public String getSeasonFeature()
return seasonFeature;
public String getSeasonName()
return seasonName;
//构造器
private Session(String seasonName,String seasonFeature)
this.seasonName = seasonName;
this.seasonFeature = seasonFeature;
@Override
public String toString()
return "["+getSeasonName()+"--->"+getSeasonFeature()+"]";
枚举常用方法
// 测试枚举常用方法
enum Week
MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期日");
private String WeekName;
private Week(String WeekName)
this.WeekName = WeekName;
class testMethod
public static void main(String[] args)
Week f = Week.FRIDAY;
// name() 获得枚举常量对象名;优先使用toString()
System.out.println(f.toString()); // FRIDAY
System.out.println(f.toString() == f.name()); // true
// ordinal() 得到当前枚举常量对象的次序 索引 0~
System.out.println(f.ordinal()); // 4
// values(); // 隐藏,Enum类中无法查看 本质: 包含所有常量对象的数组
// 实现效果: MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY
for (int i = 0; i < Week.values().length; i++)
System.out.print(Week.values()[i]+" ");
System.out.println();
/* valueOf()方法 将字符串转换成枚举对象,要求字符串必须为已有的常量对象名,否则博报错
* 源码如下
* public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name)
* T result = enumType.enumConstantDirectory().get(name);
* if (result != null) return result;
* if (name == null) throw new NullPointerException("Name is null");
* throw new IllegalArgumentException("No enum constant " +
* enumType.getCanonicalName() + "." + name);
*
*/
Week m = Week.valueOf("MONDAY");
System.out.println(m.toString()); // MONDAY
/*
* compareTo()方法:比较两个枚举常量对象 == 比较编号
* public final int compareTo(E o)
* Enum<?> other = (Enum<?>)o;
* Enum<E> self = this;
* if (self.getClass() != other.getClass() && // optimization
* self.getDeclaringClass() != other.getDeclaringClass())
* throw new ClassCastException();
* return self.ordinal - other.ordinal; // 比较编号
*
*/
System.out.println(m.compareTo(f)); // -4
注解与元注解
注解
概念:注解是绑定到程序源代码元素的元数据,对运行代码的操作没有影响。
三个基本注解: @Deprecated @Override @SuppressWarnings
public class Deprecated_
public static void main(String[]args)
A a = new A();
/*
* @Deprecated
* 特征:有划线
* 1.该注解修饰某个元素,表示该元素已经过时
* 2.即不推荐使用,但可以用
*
* @Override
* 限定于某个方法,是重写父类的方法
*
* @SuppressWarnings
* 抑制编译器警告
* 格式:@SuppressWarning("","",""...);
* 例子:@SuppressWarning("all"); 抑制所有警告
* 通常放在方法和类上
* @SuppressWarning 中的属性介绍以及属性说明
* 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,抑制与可序列化的类别遗漏serialVersionUID栏位相关的警告
* static-access,抑制与静态存取不正确相关的警告
* static-method,抑制与可能宣告为static的方法相关的警告
* super,抑制与置换方法相关但不含super呼叫的警告
* synthetic-access,抑制与内部类别的存取未最佳化相关的警告
* sync-override,抑制因为置换同步方法而遗漏同步化的警告
* unchecked,抑制与未检查的作业相关的警告
* unqualified-field-access,抑制与栏位存取不合格相关的警告
* unused,抑制与未用的程式码及停用的程式码相关的警告
*/
@Deprecated
class A
public void fly()
class B extends A
@Override
public void fly()
元注解(了解)
概念: 用来修饰注解(如@Override)
Retention 指定注解的作用范围,三种SOURCE,CLASS,RUNTIME
- RetentionPolicy.SOURCE 该注解经过编译后被丢弃
- RetentionPolicy.CLASS 该注解在解释之后被丢弃
- RetentionPolicy.RUNTIME 该注解会被保存到JVM虚拟机中
Target 指定注解可以在哪些地方使用
Documented 指定该注解是否会在javadoc体现
Inherited 子类会继承父类的注解
// @Override的源码案例分析
@Target(ElementType.METHOD) // 方法中使用
@Retention(RetentionPolicy.SOURCE) // 该注解主要是用于编译,所以在编译之后丢弃
public @interface Override // @interface 不是接口,代表注解类(jdk5.0之后添加)
以上是关于枚举和注解的主要内容,如果未能解决你的问题,请参考以下文章