**前言:**兄弟们你的三连是对我最大的鼓励。下次一定嘿嘿
我会努力认真的完成后续的文章的,希望可以帮到需要的人。
我也是特别懒惰,动不动就刷短视频就是小半天,哎呀,要自觉自觉。
接下来的文章内容来源于
[硅谷学习路线](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类的常见方法
方法 | 描述 |
---|---|
values() | 返回枚举类型的对象数组。该方法可以很方便地遍历所有的 枚举值。 |
valueOf(String str) | 可以把一个字符串转为对应的枚举类对象。要求字符 串必须是枚举类对象的“名字”。如不是,会有运行时异常: IllegalArgumentException。 |
toString() | 返回当前枚举类对象常量的名称 |
枚举类实现接口
和普通 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点才起床开始写这篇博客
关键字 | 用途 |
---|---|
all | to suppress all warnings抑制所有警告 |
boxing | to suppress warnings relative to boxing/unboxing operations抑制与 拆/装箱相关的警告 |
cast | to suppress warnings relative to cast operations抑制与强制转换相关的警告 |
dep-ann | to suppress warnings relative to deprecated annotation抑制与废弃注释相关的警告 |
deprecation | to suppress warnings relative to deprecation抑制与弃用相关的警告 |
fallthrough | to suppress warnings relative to missing breaks in switch statements抑制与switch语句中丢失的中断的相关的警告 |
finally | to suppress warnings relative to finally block that don’t return抑制finally块中不返回警告 |
hiding | to suppress warnings relative to locals that hide variable抑制相对于隐藏变量的局部变量的警告 |
incomplete-switch | to suppress warnings relative to missing entries in a switch statement (enum case)抑制相对于switch语句中丢失的条目相关的警告(枚举情况) |
nls | to suppress warnings relative to non-nls string literals抑制与non-nls字符串相关的警告 |
null | to suppress warnings relative to null analysis抑制解析为空相关的警告 |
rawtypes | to suppress warnings relative to un-specific types when using generics on class params在类参数上使用泛型时,抑制与非特定类型相关的警告 |
restriction | to suppress warnings relative to usage of discouraged or forbidden references抑制使用与禁止引用相关的警告 |
serial | to suppress warnings relative to missing serialVersionUID field for a serializable class抑制与可序列化类缺少serialVersionUID字段相关的警告 |
static-access | to suppress warnings relative to incorrect static access抑制与不正确的静态访问相关的警告 |
synthetic-access | to suppress warnings relative to unoptimized access from inner classes抑制与内部类的未优化访问相关的警告 |
unchecked | to suppress warnings relative to unchecked operations抑制与未检查操作相关的警告 |
unqualified-field-access | to suppress warnings relative to field access unqualified抑制与字段访问无关的警告 |
unused | to suppress warnings relative to unused code抑制与未使用代码相关的警告 |
自定义注解(Annotation)
这里的课程自定义注解名没有细讲,只是书明了,自定义注解的格式。
因为注解是要结合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枚举类
该枚举类存在哪些对象呢
枚举对象 | 描述 |
---|---|
RetentionPolicy.SOURCE | 在源文件中有效(即源文件保留),编译器直接丢弃这种策略的 注释 |
RetentionPolicy.CLASS | 在class文件中有效(即class保留) , 当运行 Java 程序时, JVM 不会保留注解。 这是默认值 |
RetentionPolicy.RUNTIME | 在运行时有效(即运行时保留),当运行 Java 程序时, JVM 会 保留注释。程序可以通过反射获取该注释。 |
具体使用可以参考上面的suppresswarning
Target
用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于 修饰哪些程序元素。 @Target 也包含一个名为 value 的成员变量。
这个元注解来指定修饰的注解,可以被用于是类上,属性上,方法上的等
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
注解源码,值是一个ElementType[]数组
取值 | 注解使用范围 |
---|---|
METHOD | 可用于方法上 |
TYPE | 可用于类或者接口上 |
ANNOTATION_TYPE | 可用于注解类型上(被@interface修饰的类型) |
CONSTRUCTOR | 可用于构造方法上 |
FIELD | 可用于域上 |
LOCAL_VARIABLE | 可用于局部变量上 |
PACKAGE | 用于记录java文件的package信息 |
PARAMETER | 可用于参数上 |
Documented
用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档。
默认情况下,javadoc是不包括注解的。
定义为Documented的注解必须设置Retention值为RUNTIME。
@Inherited
被它修饰的 Annotation 将具有继承性。
如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解。
比如:如果把标有@Inherited注解的自定义的注解标注在类级别上,子类则可以 继承父类类级别的注解
实际应用中,使用较少
父类使用的注解被它修饰,子类也会存在父类的注解
注解多用
我们在使用注解的时候发现一个注解修饰类或属性等的时候
只能使用一次,如果想要使用多次呢
JDK8前
使用另一个注解讲需要多次添加的注解设置为数组,添加
JDK8之后
@Repeatable(需要多此注解类放入即可)