文章目录
一、枚举类
-
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
-
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
- 关于枚举类的使用
1.枚举类的理解: 类的对象只有有限个,确定的(不能再去构造,需要私有化构造器),称此类为枚举类 ;
2.当需要定义一组常量时,强烈建议使用枚举类 ;
3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式;
1.自定义枚举类
- 方式 1 : jdk 5.0之前,自定义枚举类
- 方式 2 : jdk 5.0,可以使用enum关键字定义枚举类
/* 定义一年四季的枚举类 */
public class SeasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
Season summer = Season.SUMMER;
System.out.println(spring);
summer.show();
}
}
interface Info{
void show();
}
//自定义枚举类
class Season implements Info{
//1.声明Season对象的属性 : private final 修饰
private final String seasonName;
private final String seasonDesc;
//2.私有化类的构造器 : 并给对象属性赋值
private Season(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//3.提供当前枚举类的多个对象 : public static final的
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("冬天","冰天雪地");
//4.其他诉求1 : 获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//4.提供诉求2 : toString
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
@Override
public void show() {
System.out.println("这是接口 --- 季节");
}
}
2.使用关键字enum定义枚举类
/**
* 使用enum关键字定义枚举类
* 【相比自定义枚举类,enum在提供枚举类对象时,不必太过繁琐】
* 说明 : 定义的枚举类默认继承于class java.lang.Enum类
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 spring = Season1.SPRING;
Season1 winter = Season1.WINTER;
System.out.println(Season1.class.getSuperclass());
//toString():
System.out.println(winter.toString());
System.out.println("************************************");
//values():
Season1[] values = Season1.values();
for (int i = 0; i < values.length; i++){
System.out.println(values[i]);
values[i].show();
}
System.out.println("************************************");
Thread.State[] values1 = Thread.State.values();
for (int i = 0; i < values1.length; i++) {
System.out.println(values1[i]);
}
System.out.println("**************************");
//valueOf(String objName) : 返回枚举类中对象名是objName 的对象
/*
Season1 winter2 = Season1.valueOf("WINTER2");
System.out.println(winter2);*/
//如果没有objName的枚举类对象,则抛异常:IllegalArgumentException
Season1 winter1 = Season1.valueOf("WINTER");
System.out.println(winter1);
}
}
//定义接口
interface Info1{
void show();
}
//自定义枚举类
enum Season1 implements Info1{
//1.提供当前枚举类的多个对象 , 多个对象之间用“,”隔开,末尾对象用“;”结束
SPRING("春天","春暖花开"){
@Override
public void show() {
System.out.println("春天到了");
}
},
SUMMER ("夏天","夏日炎炎"){
@Override
public void show() {
System.out.println("夏天到了");
}
},
AUTUMN ("秋天","秋高气爽"){
@Override
public void show() {
System.out.println("秋天到了");
}
},
WINTER("冬天","冰天雪地"){
@Override
public void show() {
System.out.println("冬天到了");
}
};
//2.声明Season对象的属性 : private final 修饰
private final String seasonName;
private final String seasonDesc;
//3.私有化类的构造器 : 并给对象属性赋值
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//4.其他诉求1 : 获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
//4.提供诉求2 : toString
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
运行结果:
3.Enum类的主要方法
values(), ordinal() 和 valueOf() 方法
enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和java.lang.Comparable 两个接口。
- values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:
- values() 返回枚举类中所有的值。
- ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
- valueOf()方法返回指定字符串值的枚举常量。
4.实现接口的枚举类
和普通 Java 类一样,枚举类可以实现一个或多个接口.
- 若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只
要统一实现该方法即可。 - 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,
则可以让每个枚举值分别来实现该方法.
本文,展示的代码全部为实现接口的枚举类;如果不需要实现接口,去掉即可。
5.两种枚举的最主要区别:
- 自定义枚举类比enum类更加繁琐一点
- 两者定义过程分别如下:
自定义枚举类:
1.声明要自定义类的对象的属性:private final 修饰;
2.私有化类的构造器,给对象赋值;
3.提供当前枚举类的多个对象:public static final ;enum类枚举:
1.提供当前枚举类的多个对象,多个对象之间用‘ ,’隔开,末尾对象用‘ ;’结束;
2.声明要定义类的对象的属性:private final 修饰;
3.私有化类的构造器,给对象赋值;
二、注解的使用
1.概述
- Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
- Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
2.注解实例
内置的注解
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是
注解名称 | 注解作用 |
---|---|
@Override | 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。 |
@Deprecated | 标记过时方法。如果使用该方法,会报编译警告。 |
@SuppressWarnings | 指示编译器去忽略注解中声明的警告。 |
作用在其他注解的注解(元注解):
注解名称 | 注解作用 |
---|---|
@Retention | 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。 |
@Documented | 标记这些注解是否包含在用户文档中。 |
@Target | 标记这个注解应该是哪种 Java 成员。 |
@Inherited | 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类) |
从 Java 7 开始,额外添加了 3 个注解:
注解名称 | 注解作用 |
---|---|
@SafeVarargs | Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。 |
@FunctionalInterface | Java 8 开始支持,标识一个匿名函数或函数式接口。 |
@Repeatable | Java 8 开始支持,标识某注解可以在同一个声明上使用多次。 |
3.自定义Annotation
- 如何自定义注解 : 参照@SuppressWarnings定义
① 注解声明为: @interface
② 内部定义成员,通常使用value表示
③可以指定成员的默认值,使用default定义
④ 如果自定义注解没有成员,表明是一个标识作用
【如果注解没有成员,在使用注解时,需要指明成员的值】
public @interface MyAnnotation {
String value() default "hello";
}
public class AnnotationTest {
public static void main(String[] args) {
Person p = new Stu();
p.eat();
Date date = new Date();
System.out.println(date);
}
}
@MyAnnotation()
class Person{
@SuppressWarnings("unsued")
private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void walk(){
System.out.println("人走路");
}
public void eat(){
System.out.println("人吃饭");
}
}
interface Info{
void show();
}
class Stu extends Person implements Info{
@Override
public void walk() {
System.out.println("学生走路");
}
@Override
public void show() {
System.out.println("快看,接口!");
}
}