Java笔记---枚举类和注解
Java笔记---枚举类和注解
一、枚举类
自定义枚举类
方式一:JDK5.0之前自定义枚举类
class Seasons {
//1. 声明Seasons对象的属性
private final String SeasonName;
private final String SeasonDescrp;
//2. 私有化类的构造器, 并给对象赋值初始化
private Seasons(String SeasonName, String SeasonDescrp) {
this.SeasonDescrp = SeasonDescrp;
this.SeasonName = SeasonName;
}
//3. 提供当前枚举类的多个对象 public static final "枚举类的名字"
public static final Seasons SPRING = new Seasons("SPRING", "春天");
public static final Seasons SUMMER = new Seasons("SUMMER", "夏天");
public static final Seasons AUTUMN = new Seasons("AUTUMN", "秋天");
public static final Seasons WINTER = new Seasons("WINTER", "冬天");
//4. 获取枚举类对象的属性
public String getSeasonName() {
return SeasonName;
}
public String getSeasonDescrp() {
return SeasonDescrp;
}
@Override
public String toString() {
return "Seasons{" +
"SeasonName='" + SeasonName + '\'' +
", SeasonDescrp='" + SeasonDescrp + '\'' +
'}';
}
}
调用这个类:
public class TestEnum {
public static void main(String[] args) {
Seasons spring = Seasons.SPRING;
System.out.println(spring);
}
}
Seasons{ SeasonName='SPRING', SeasonDescrp='春天'}
以上为该自定义枚举类的输出结果
方式二:JDK5.0之后引入关键字enum
定义枚举类
enum Season {
//多个对象之间用逗号,最后一个对象用分号结束
SPRING("SPRING", "春天"),
SUMMER("SUMMER", "夏天"),
AUTUMN("AUTUMN", "秋天"),
WINTER("WINTER", "冬天");
//下面的声明和方式一并无多大差别
//1. 声明Seasons对象的属性
private final String SeasonName;
private final String SeasonDescrp;
//2. 私有化类的构造器, 并给对象赋值初始化
private Season(String SeasonName, String SeasonDescrp) {
this.SeasonDescrp = SeasonDescrp;
this.SeasonName = SeasonName;
}
}
那么,枚举类为何没有重写toString()方法呢?
public class TestEnum {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
System.out.println(Season.class.getSuperClass());
}
}
SPRING
class java.lang.Enum
以上呢就是输出结果了!可见,这个类中的toString()方法已经再Enmu类中重写过了
Enum类中的常用方法
- values():返回枚举类型的对象数组。该方法可以很便利的遍历所有枚举值。
- valuesOf(String objName):根据提供的objName,返回一个对象名是objName的枚举类型的对象
- toString():返回当前常量的名称
public class TestEnum {
public static void main(String[] args) {
Season spring = Season.SPRING;
//toString()方法
System.out.println(spring);
//values()方法
Season[] values = Season.values();
for (Season temp : values) {
System.out.println(temp);
}
System.out.println(Season.class.getSuperClass());
//valueOf(String objName)
//如果找不到与objName同名的对象时候,会抛出一个异常IllegalArgumentException
Season winter = Season.valueOf("WINTER");
System.out.println(winter);
}
}
使用enum关键字定义的枚举类实现接口
情况一:实现接口。再enum类中实现接口
interface Info {
//显示对象的名字
void show();
}
enum Season implements Info {
//多个对象之间用逗号,最后一个对象用分号结束
SPRING("SPRING", "春天"),
SUMMER("SUMMER", "夏天"),
AUTUMN("AUTUMN", "秋天"),
WINTER("WINTER", "冬天");
//1. 声明Seasons对象的属性
private final String SeasonName;
private final String SeasonDescrp;
//2. 私有化类的构造器, 并给对象赋值初始化
private Season(String SeasonName, String SeasonDescrp) {
this.SeasonDescrp = SeasonDescrp;
this.SeasonName = SeasonName;
}
@Override
public void show() {
System.out.println("这是一个季节");
}
}
情况二:让枚举类的对象,分别实现接口中的方法
interface Info {
//显示对象的名字
void show();
}
enum Season implements Info {
//多个对象之间用逗号,最后一个对象用分号结束
SPRING("SPRING", "春天"){
@Override
public void show() {
//春天的方法
}
},
SUMMER("SUMMER", "夏天") {
@Override
public void show() { }
},
AUTUMN("AUTUMN", "秋天") {
@Override
public void show() { }
},
WINTER("WINTER", "冬天") {
@Override
public void show() { }
};
//1. 声明Seasons对象的属性
private final String SeasonName;
private final String SeasonDescrp;
//2. 私有化类的构造器, 并给对象赋值初始化
private Season(String SeasonName, String SeasonDescrp) {
this.SeasonDescrp = SeasonDescrp;
this.SeasonName = SeasonName;
}
}
让每一个对象实现一次接口方法,使得每个对象有不同的动作。
二、注解
Annotation是在代码里的特殊标记这些标记可以在编译时,类加载时被读取,并作出相应的处理。不改变原有逻辑的情况下,在程序中添加一些补充信息。
应用
应用一:在生成文档中使用注解(javadoc)
@author @param @return @version 等等。
应用二:编译时进行格式检查(JDK内置的三个注解)
@Override 表示限定重写父类方法,该注解只能用于方法
@Deprecated 表示所修饰的怨妇已经过时。通常是因为所修饰的结构危险或者存在更好的选择
@SuppressWarnings 抑制编译器警告
class Person {
public void walk() {
System.out.println("人走路");
}
//下面的用于标记,这个方法已经过时了
@Deprecated
public void eat() {
System.out.println("人吃饭");
}
}
interface Info {
void show();
}
class Student extends Person implements Info {
//标记用于重写父类中的方法,以及实现接口中的方法
@Override
public void walk() { System.out.println("学生走路"); }
@Override
public void show() { System.out.println("我是学生"); }
public static main(String[] args) {
//在代码中,创建的变量未使用会有警告Waring
//这里的unused就是表示忽略,没使用这个警告的
@SuppressWarnings("unused")
int num = 100;
//System.out.println(num);
//下面的这种"rawtypes"适用于使用泛型的时候并没有选取类型的警告
@SuppressWarnings({"unused", "rawtypes"})
ArrayList list = new ArrayList();
}
}
应用三:跟踪代码依赖性,实现代替配置文件功能
Servlet3.0提供了注解,使得不需要在web.xml文件中进行Servlet的部署
自定义注解
- 自定义新注解使用 @interface 关键字
- 定义 Annotation 成员变量时,以 无参数方法 的形式来声明。
- 只有一个参数成员,建议使用value命名
- 如果注解没有成员表明是一个标识作用
- 使用注解的时候,需要设定一个值,如果已经有了默认值值,那么,就可以不用手写默认值了。
- 自定义的注解,需要配上信息处理流程(使用反射)才有意义。
- 通常会指明两个元注解,@Retention 和 @Target
public @interface CustomAnnotation {
//只有一个值的话值的名字叫做value就很好
//String value();
//当然也可以使用default设置为默认值
String value() default "Hello";
}
JDK中的元注解
元注解:对于现有注解进行修饰的注解。
JDK5.0 提供了4个标准的元注解(meta-annotation)类型:
Retention:指明所有修饰的 Annotation 的生命周期,其中包含了一个RetentionPolicy类型的成员变量。<详见JDK API>
- 相关的Java SE API
- 从上面可以看出只有 RUNTIME 才可以使用反射
- 相关的Java SE API
Target:用于修饰 Annotation 的定义,用于 指定 被修饰的 Annotation 能用于修饰那些程序元素
- 相关的Java SE API
- 相关的Java SE API
Documented:用于指定被该元注解修饰的 Annotation 类将会被javadoc提取为相应的文档,默认情况下Javadoc是不包括注解的
Inherited:被它修饰的 Annotation 将具有继承性。如果某个类使用了被@Inherited标记的Annotation那么子类中也会继承父类中的,这个Annotation。
通过反射获取注解信息
JDK8 中注解的新特性
可重复注解
//JDK8.0之前想要使用重复注解的方法
public @interface MyAnnotations {
MyAnnotation[] value();
}
public @interface MyAnnotation {
String[] value();
}
@MyAnnotations({
@MyAnnotation(value = "hello"),
@MyAnnotation(value = "hi")
})
class Person {
public void walk() {
System.out.println("人走路");
}
//下面的用于标记,这个方法已经过时了
@Deprecated
public void eat() {
System.out.println("人吃饭");
}
}
- 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
- MyAnnotation的Target和Retention与MyAnnotations相同
//这个是目标注解
import java.lang.annotation.*;
//使用注解@Rpeatable与这个注解的容器注解产生关联
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "hello";
}
//这个是目标注解的容器注解
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {
MyAnnotation[] value();
}
//这是使用
@MyAnnotation("Hello")
@MyAnnotation("hi")
class Person {
public void walk() {
System.out.println("人走路");
}
//下面的用于标记,这个方法已经过时了
@Deprecated
public void eat() {
System.out.println("人吃饭");
}
}
通过上下的比较,可以发现,JDK8的新特性是对原来注解嵌套的简化。
Java笔记---枚举类和注解的更多相关文章
- java基础---枚举类与注解
一.枚举类 类的对象只有有限个,确定的.我们称此类为枚举类 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. 定义枚举类 方式一:jdk5.0之前,自定义枚举类 public class Se ...
- 【Java基础】枚举类与注解
枚举类与注解 枚举类的使用 当需要定义一组常量时,强烈建议使用枚举类. 枚举类的理解:类的对象只有有限个,确定的. 若枚举只有一个对象, 则可以作为一种单例模式的实现方式. 枚举类的属性: 枚举类对象 ...
- Java枚举类、注解和反射
本文主要介绍的是枚举类,注解和反射.还有一些基础知识:static,基本数据类型,运算符优先级放在文中,以便查阅复习. 其中牵扯到泛型的部分,可参考本人的另一篇博客:(Collection, List ...
- Java学习——枚举类
Java学习——枚举类 摘要:本文主要介绍了Java的枚举类. 部分内容来自以下博客: https://www.cnblogs.com/sister/p/4700702.html https://bl ...
- Java语法基础学习DayThirteen(枚举类和注解)
一.枚举类 1.概述:即一个类中只能有有限个对象,若只有一个对象,则可以作为单例模式的一种实现. 2.自定义枚举类(JDK1.5以前这么做) //枚举类 class Season{ //1.提供类的属 ...
- Java枚举类和注解梳理
1. 枚举类 1. 枚举类的使用 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类. 当需要定义一组常量时,强烈建议使用枚举类. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. ...
- Java笔记--枚举&注解
1.自定义枚举类的实现,例: class Season{ //1,提供类的属性,声明为rivate final private final String name; private final Str ...
- Java枚举类与注解详解——一篇文章读懂枚举类与注解详
目录 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举类实现接口 二.注解 ① 生成文档相关注解 ②注解在编译时进行格式检查 ③注解跟踪代码的 ...
- Java学习笔记-枚举类
实例有限且固定的类成为枚举类 枚举类的实现 早期时候的实现形式: public static final int SEASON_SPRING = 1; public static final int ...
随机推荐
- scrapy selector选择器
这部分内容属于补充内容 1.xpath() 2.css() 3.正则表达式 # 多个值,列表 response.xpath('//a/text()').re('(.*?):\s(.*)') # 取第一 ...
- 嵩天老师python网课爬虫实例1的问题和解决方法
一,AttributeError: 'NoneType' object has no attribute 'children', 网页'tbody'没有子类 很明显,报错的意思是说tbody下面没有c ...
- Commvault Oracle备份常用命令
在进行Oracle数据库备份的配置.发起和恢复的过程中,需要用到许多Oracle数据库本身的命令.在此章节中进行命令的梳理,供大家参考. Oracle用户和实例相关命令 Linux/Unix平台 # ...
- Python经典算法-快速幂
快速幂 问题描述: 计算a ** n % b 其中a.b和n都是32位的非负整数 即求a的n次方对b的余数 问题示例: 例如:2**31%3=2 --- 代码实现如下 class Solution: ...
- 手把手教你用C#做疫情传播仿真
手把手教你用C#做疫情传播仿真 在上篇文章中,我介绍了用C#做的疫情传播仿真程序的使用和配置,演示了其运行效果,但没有着重讲其中的代码. 今天我将抽丝剥茧,手把手分析程序的架构,以及妙趣横生的细节. ...
- 《算法九》(A星寻路算法)
A星寻路: 结构:N叉树 直线代价斜线代价:符合勾股定理 代价:每走一步,距离终点所付出的 计算公式:f = g + h + w; f : 当前点到终点的代价 g : 起点到当前点的代价 h : 当前 ...
- HTTP协议简单理解
1.概念: “超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准. 设计HTTP最初的目的是为了 ...
- C++ ABI之名字改编(以Qt为例)
在C++中,由于重载等技术的存在,编译器要将函数.结构体.类等等的信息传递给链接器,就不能像C语言那样简单地通过函数名来完成,它需要提供额外的参数信息,而还要和C语言共用链接器,这就需要用到名字改编( ...
- Oracle操作语句--增加/删除
1.删除1980年雇员的雇员信息: delete from myemp where hiredate between to_date('1980-1-1','yyyy-mm-dd') and ...
- 关于RiscV的一些资料整理
1. 基于RISC-V架构的开源处理器及SoC研究综述 https://mp.weixin.qq.com/s/qSD-q8y0_MY8R0MBA85ZZg 原文链接: https://blog.csd ...