**前言:**兄弟们你的三连是对我最大的鼓励。下次一定嘿嘿
我会努力认真的完成后续的文章的,希望可以帮到需要的人。
我也是特别懒惰,动不动就刷短视频就是小半天,哎呀,要自觉自觉。
接下来的文章内容来源于
[硅谷学习路线](2021年度全网最全Java学习路线 - 哔哩哔哩 (bilibili.com))
2021年黑马程序员Java学习路线图 - 哔哩哔哩 (bilibili.com)
枚举类当一个类,创建对象是固定个数的,我们可以称之为枚举类
比如所:
季节类:创建对象(春夏秋冬)
性别类:只能存在(男,女,雌雄双体,无性)哈哈
总的来说就是这个类的只能创建这几个对象,单例模式:还只能创建一个对象呢
当需要定义一组常量时候,强烈建议使用枚举类
如何定义枚举类JDK5.0前:通过自己编写代码来实现
JDK5.0后:可以使用enum关键字定义枚举类
自定义枚举类自定义一个季节类,只能创建春夏秋冬四个季节
//通过自定义代码创建一个季节枚举类 //该类只存在春夏秋冬四个对象表示不同的季节 public class Season { // 设置属性为私有的常量 // 不能直接进行调用属性且不能赋值 private final String SEASONNAME;//季节的名称 private final String SEASONDESC;//季节的描述 // 设置类属性的get方法可以用来输出属性值 public String getSEASONNAME(){ return SEASONNAME; } public String getSEASONDESC(){ return SEASONDESC; } // 设置私有的构造函数 // 不能再本类外通过构造函数创建对象了 private Season(String seasonName, String seasonDesc) { this.SEASonNAME = seasonName; this.SEASonDESC = seasonDesc; } // 设置共有的 静态的 常量的 属性这个属性表示的就是该类的对象 // 表示该类只能存在这四个对象(春夏秋冬) public static final Season SPRING = new Season("春天", "春暖花开"); public static final Season SUMMER = new Season("夏天", "夏日炎炎"); public static final Season AUTUMN = new Season("秋天", "秋高气爽"); public static final Season WINTER = new Season("冬天", "白雪皑皑"); @Override public String toString(){ return "Season{季节名称:"+SEASONNAME+",季节描述:"+SEASONDESC+"}"; } }
调用做测试
public class SeasonTest { public static void main(String[] args) { // 只能通过指定的静态属性获取对象 Season spring = Season.SPRING; System.out.println(spring.toString()); } }
发现上面的代码:确实可以实现一个类创建固定个数的对象。
我们接下来使用enum关键进行编写枚举类
Enum关键字使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再 继承其他类 ,所以tostring的功能也是发生了改变
枚举类的构造器只能使用 private 权限修饰符
枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的 实例系统会自动添加 public static final 修饰
必须在枚举类的第一行声明枚举类对象
JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象 作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举 类作为限定。
//使用enum关键字创建枚举类 public enum SeasonEnum { // 首先是对象一定要声明在这里位置 // 并且省略很多部分 多个对象之间使用逗号隔开 SPRING("春天","春暖花开"), SUMMER("夏天","夏日炎炎"), AUTUMN("秋天","秋高气爽"), WINTER("冬天","白雪皑皑"); // 设置属性为私有的常量 // 不能直接进行调用属性且不能赋值 private final String SEASONNAME;//季节的名称 private final String SEASONDESC;//季节的描述 // 设置类属性的get方法可以用来输出属性值 public String getSEASONNAME() { return SEASONNAME; } public String getSEASONDESC() { return SEASONDESC; } // 设置私有的构造函数 // 不能再本类外通过构造函数创建对象了 private SeasonEnum(String seasonName, String seasonDesc) { this.SEASonNAME = seasonName; this.SEASonDESC = seasonDesc; } @Override public String toString() { return "Season{季节名称:" + SEASonNAME + ",季节描述:" + SEASonDESC + "}"; } }
public class SeasonTest { public static void main(String[] args) { // 只能通过指定的静态属性获取对象 Season spring = Season.SPRING; System.out.println(spring.toString()); SeasonEnum spring1 = SeasonEnum.SPRING; System.out.println(spring1); } }
这里说明一下,使用enum关键字之后,该类就不是默认继承Object类了。
enum类的常见方法和普通 Java 类一样,枚举类可以实现一个或多个接口
若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法
package Enum; //使用enum关键字创建枚举类 public enum SeasonEnum implements HH { // 首先是对象一定要声明在这里位置 // 并且省略很多部分 多个对象之间使用逗号隔开 // 还可以在具体的对象,使用不同的 *** 作 SPRING("春天", "春暖花开") { public void show() { } }, SUMMER("夏天", "夏日炎炎"){ }, AUTUMN("秋天", "秋高气爽"), WINTER("冬天", "白雪皑皑"); // 可以创建一个大家都使用的方法 public void show() { } // 设置属性为私有的常量 // 不能直接进行调用属性且不能赋值 private final String SEASONNAME;//季节的名称 private final String SEASONDESC;//季节的描述 // 设置类属性的get方法可以用来输出属性值 public String getSEASONNAME() { return SEASONNAME; } public String getSEASONDESC() { return SEASONDESC; } // 设置私有的构造函数 // 不能再本类外通过构造函数创建对象了 private SeasonEnum(String seasonName, String seasonDesc) { this.SEASonNAME = seasonName; this.SEASonDESC = seasonDesc; } @Override public String toString() { return "Season{季节名称:" + SEASonNAME + ",季节描述:" + SEASonDESC + "}"; } } //创建一个接口,中存在一个展示方法 interface HH { void show(); }
这里再使用图片展示一下
注解(Annotation)从 JDK 5.0 开始, Java 增加了对元数据(metaData) 的支持, 也就是 Annotation(注解)
Annotation 其实就是代码里的特殊标记,
这些标记可以在编译, 类加 载, 运行时被读取, 并执行相应的处理。
通过使用 Annotation, 程序员 可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。
代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证 或者进行部署。
Annotation 可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方 法, 成员变量, 参数, 局部变量的声明, 这些信息被保存在 Annotation 的 “name=value” 对中。
未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以 上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的 Struts2有一部分也是基于注解的了,注解是一种趋势,一定程度上 可以说:框架 = 注解 + 反射 + 设计模式。
注解的使用注解:之后在学框架的时候就可以广泛的体验到注解带来的便捷了
JDK内置注解 @Override限定重写父类方法, 该注解只能用于方法
就是说子类继承父类放在子类的重写方法上,不放也可以,放一些起到标识作用。
如果乱放,回报警告
@Deprecated用于表示所修饰的元素(类, 方法等)已过时。通常是因为 所修饰的结构危险或存在更好的选择
这个注解用于修饰已经过时。
public void show() { Date date = new Date(); // 看到这里的方法画了一个线,表示这个方法应经过时,建议不用但是可以使用 date.getYear(); }
Date源码
@SuppressWarnings抑制编译器警告
比如说,我们再声明变量的时候,变量在没有使用的时候,会显示不同的颜色,如果想要使它没有这类效果就可以使用该注解
使用前
使用后
该注解常用参数我是百度小能手,有问题问百度。实在不行就可以将问题放到CSDN上面就会有人帮你解答。最后在问周边人(哈哈加油吧)今天12点才起床开始写这篇博客
这里的课程自定义注解名没有细讲,只是书明了,自定义注解的格式。
因为注解是要结合java反射一起使用的。
反射:可以在java程序执行中动态的改变代码,反射可以 *** 作一个类,方法,属性的API。(这里之后会提到)
自定义注解格式定义新的 Annotation 类型使用 @interface 关键字
自定义注解自动继承了java.lang.annotation.Annotation接口
Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明。其 方法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能 是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、 以上所有类型的数组。
可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始 值可使用 default 关键字
如果只有一个参数成员,建议使用参数名为value
没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数 据 Annotation
示例:标记注解//我的第一个注解 //通过@interface 声明了一个注解 //没有一个放入 定义成员属性 就是标记注解 public @interface MyOneAnnotation { }
//测试我的注解 //现在这个注解并没有作用,作用是需要结合反射进行编写的。 @MyOneAnnotation public class AnnotationTest { }示例 指定值注解
//我的第一个注解 //通过@interface 声明了一个注解 //没有一个放入 定义成员属性 就是标记注解 public @interface MyOneAnnotation { // 设置一个带有默认值的value String value() default "默认值"; }
//测试我的注解 //现在这个注解并没有作用,作用是需要结合反射进行编写的。 //表示使用了默认值 @MyOneAnnotation() public class AnnotationTest { public static void main(String[] args) { // 这个value可以不写,不写默认也是指定value @MyOneAnnotation(value = "hhh") String str; } }
对于注解的详细使用,我会在反射中继续编写
JDK元注解JDK5.0提供了4个标准的meta-annotation类型,分别是:
- Retention
- Target
- documented
- Inherited
所谓的元注解就是用来修饰 其他的注解(Annotation)注解
这是@SuppressWarning注解,发现上面还存在一些注解,用于修饰它的注解
Retention只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 的生命 周期, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:
RetentionPolicy枚举类该枚举类存在哪些对象呢
具体使用可以参考上面的suppresswarning
Target用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于 修饰哪些程序元素。 @Target 也包含一个名为 value 的成员变量。
这个元注解来指定修饰的注解,可以被用于是类上,属性上,方法上的等
@documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { ElementType[] value(); }
注解源码,值是一个ElementType[]数组
用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档。
默认情况下,javadoc是不包括注解的。
定义为documented的注解必须设置Retention值为RUNTIME。
@Inherited被它修饰的 Annotation 将具有继承性。
如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解。
比如:如果把标有@Inherited注解的自定义的注解标注在类级别上,子类则可以 继承父类类级别的注解
实际应用中,使用较少
父类使用的注解被它修饰,子类也会存在父类的注解
注解多用我们在使用注解的时候发现一个注解修饰类或属性等的时候
只能使用一次,如果想要使用多次呢
JDK8前使用另一个注解讲需要多次添加的注解设置为数组,添加
JDK8之后@Repeatable(需要多此注解类放入即可)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)