枚举和注解

一.枚举

1.什么是枚举类?

        ——使用enum关键字修饰的类叫做枚举类

2.格式

enum 枚举明 {

        //首行必须是枚举对象

        //属性

        //构造器

        //方法

}

3.自定类实现枚举

  • 将构造器私有化
  • 只提供公共的getter方法,不提供setter方法
  • 枚举对象和属性使用public + static进行修饰【类不会加载】
  • 枚举也是常量,常量名需要大写
public class Test {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
    }
}

class Season {
    public final static Season SPRING = new Season("春天", "万物复苏");
    public final static Season SUMMER = new Season("夏天", "天气炎炎");
    public final static Season AUTUMN = new Season("秋天", "心中凉爽");
    public final static Season WINTER = new Season("冬天", "万物沉睡");

    //属性
    private String name;
    private String describe;

    //构造器私有化
    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }

    //getter方法
    public String getName() {
        return name;
    }

    public String getDescribe() {
        return describe;
    }

    //toString方法
    public String toString() {
        return name + " " + describe;
    }
}

4.一个小case快速了解枚举【enum】类

public class Test {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
    }
}

enum Season {
    //枚举对象
    SPRING("春天", "万物复苏"), SUMMER("夏天", "天气炎炎"),
    AUTUMN("秋天", "心中凉爽"), WINTER("冬天", "万物沉睡");

    //属性
    private String name;
    private String describe;

    //构造器私有化
    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }

    //getter方法
    public String getName() {
        return name;
    }

    public String getDescribe() {
        return describe;
    }

    //提供toString方法
    public String toString() {
        return name + " " + describe;
    }
}

5.枚举的细节讨论及实现

  • 当要使用enum来开发一个枚举类时,这个类自动的继承了Enum类,且这个类是final的

枚举和注解_第1张图片

  • 当使用枚举对象的时候,要清楚调用的是哪个构造器【无参构造器只需要写枚举对象名】
  • 当有多个枚举对象的时候,使用逗号间隔,最好需要有一个分号结尾
  • 枚举对象必须放在枚举类的行首
public class Test {
    public static void main(String[] args) {
    }
}

enum Season {
    //无参构造器只需要写对象名
    //枚举对象必须放在枚举类的行首
    SPRING("春天", "万物复苏"), SUMMER, AUTUMN;

    //属性
    private String name;
    private String describe;

    //构造器私有化
    private Season() {
    }

    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }
}

6.Enum常用方法

  • toString方法:子类进行重写,返回当前对象属性的信息
public class Test {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
    }
}

enum Season {
    SPRING("春天", "万物复苏");

    //属性
    private String name;
    private String describe;

    //构造器
    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }

    //重写toString方法
    public String toString() {
        return name + " " + describe;
    }
}
  • name方法:返回当前对象名(常量名),子类不能重写
public class Test {
    public static void main(String[] args) {
        System.out.println(Season.SPRING.name());//SPRING
    }
}

enum Season {
    SPRING("春天", "万物复苏");

    //属性
    private String name;
    private String describe;

    //构造器
    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }
}
  • ordinal:返回当前对象的位置号,默认从0开始
public class Test {
    public static void main(String[] args) {
        System.out.println(Season.SPRING.ordinal());//0
        System.out.println(Season.SUMMER.ordinal());//1
        System.out.println(Season.AUTUMN.ordinal());//2
        System.out.println(Season.WINTER.ordinal());//3
    }
}

enum Season {
    SPRING("春天", "万物复苏"), SUMMER("夏天", "天气炎炎"),
    AUTUMN("秋天", "心中凉爽"), WINTER("冬天", "万物沉睡");

    //属性
    private String name;
    private String describe;

    //构造器
    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }
}
  • values:返回当前枚举类中所有的常量
public class Test {
    public static void main(String[] args) {
        Season[] seasons = Season.values();
        for (int i = 0; i < seasons.length; i++) {
            System.out.println(seasons[i]);
        }
    }
}

enum Season {
    SPRING("春天", "万物复苏"), SUMMER("夏天", "天气炎炎"),
    AUTUMN("秋天", "心中凉爽"), WINTER("冬天", "万物沉睡");

    //属性
    private String name;
    private String describe;

    //构造器
    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }
}
  • valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报错
public class Test {
    public static void main(String[] args) {
        System.out.println(Season.OTHER);
    }
}

enum Season {
    SPRING("春天", "万物复苏"), SUMMER("夏天", "天气炎炎"),
    AUTUMN("秋天", "心中凉爽"), WINTER("冬天", "万物沉睡");

    //属性
    private String name;
    private String describe;
    //将字符串转换成枚举对象
    public final static Season OTHER = Season.valueOf("SPRING");

    //构造器
    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }
}
  • compareTo:比较两个枚举常量,比较的是编号【返回的是两者之差】
public class Test {
    public static void main(String[] args) {
        System.out.println(Season.SPRING.compareTo(Season.SUMMER));//-1
        System.out.println(Season.SPRING.compareTo(Season.AUTUMN));//-2
        System.out.println(Season.SPRING.compareTo(Season.WINTER));//-3
        System.out.println(Season.WINTER.compareTo(Season.SPRING));//3
    }
}

enum Season {
    SPRING("春天", "万物复苏"), SUMMER("夏天", "天气炎炎"),
    AUTUMN("秋天", "心中凉爽"), WINTER("冬天", "万物沉睡");

    //属性
    private String name;
    private String describe;

    //构造器
    private Season(String name, String describe) {
        this.name = name;
        this.describe = describe;
    }
}

二.注解

1.注解的理解

  • 注解(元数据),用于修饰解释包、类、构造器、方法、属性、局部变量等数据信息
  • 注释不能被编译或运行,注解可以被编译或运行,相当于嵌入在到吗中的补充信息

2.基本的注解介绍

使用注解的时候需要在其前面加@符号,并把对应的注解当做一个修饰符使用【即修饰支持注解的程序元素】

  • @Override:该注解只能重写父类的方法【限定方法】
  • @Deprecated:表示某个程序元素(类/方法)已经过时
  • @SuppressWarnings:抑制编译器的警告

3.一个小case快速了解注解

public class Test {
    public static void main(String[] args) {
        Kid kid = new Kid();
        kid.say();
        System.out.println(kid.name);
    }
}

@SuppressWarnings({"all"})//把所有的警告镇压【该类不会报警告】
class Parent {
    @Deprecated//表示这个name已经过时了
    public String name = "jack";

    public void say() {
        System.out.println("父亲说:我为我的儿子感到骄傲~");
    }
}

@SuppressWarnings({"all"})
class Kid extends Parent {
    private int age = 10;

    @Override//该注解只能用于重写父类方法
    public void say() {
        System.out.println("孩子说:我要努力学习~");
    }
}

4.注解的细节讨论及实现

  • @Override的细节

1> @Override表示重写父类的方法【编译方面验证】,如果使用@Override后但是没有重写父类方法,则编译器报错

2> 如果不写@Override,但是子类中还是有重写的方法,也构成重写

3> @Override只能修饰方法,不能修饰其他的

public class Test {
    public static void main(String[] args) {
        Kid kid = new Kid();
        kid.say();
        kid.hi();
    }
}

class Parent {
    public String name = "jack";

    public void say() {
        System.out.println("父亲说:我为我的儿子感到骄傲~");
    }

    public void hi() {
        System.out.println("hi~");
    }
}

class Kid extends Parent {

    @Override//该注解只能用于重写父类方法
    public void say() {
        System.out.println("孩子说:我要努力学习~");
    }

    //没有使用@Override也构成了重写
    //@Override只能修饰方法
    public void hi() {
        System.out.println("孩子说:hi");
    }

    //如果使用了@Override但没有重写,则保错
    //@Override //使用则报错
    public void hello() {
    }
}
  • @Deprecated的细节

1> 某个类、方法、属性、构造器被@Deprecated修饰后,表示已过时

public class Test {
    public static void main(String[] args) {
        //使用过时的值时中间会加中划线
        Kid kid = new Kid();
    }
}

class Parent {
    @Deprecated //修饰属性,属性已过时
    public String name = "jack";

    public void say() {
        System.out.println("父亲说:我为我的儿子感到骄傲~");
    }

    @Deprecated //修饰方法,方法已过时
    public void hi() {
        System.out.println("hi~");
    }
}

@Deprecated//修饰类,即类已过时
class Kid {
}
  • @SuppressWarnings的细节

1> unchecked:忽略没有检查的值

2> rawtypes:忽略没有指定泛型的警告【传参时没有指定泛型的警告错误】

3> unused:忽略没有使用某个变量的警告

import java.util.ArrayList;
import java.util.List;

public class Test {
    @SuppressWarnings({"unused", "rawtypes"})
    public static void main(String[] args) {
        List lists = new ArrayList();

    }
}

//@SuppressWarnings("all"): 表示把该类所有的警告全部屏蔽
@SuppressWarnings("unused")
class Parent {
    public String name = "jack";

    public void say() {
        System.out.println("父亲说:我为我的儿子感到骄傲~");
    }

    public void hi() {
        System.out.println("hi~");
    }
}

6.元注解

  • 什么是元注解?

元注解是用于修饰其他注解的

  • 元注解的类型

1> Retention:指定注解的作用范围【SOURCE,CLASS,RUNTIME】

2> Target:指定注解可以在那些地方使用

3> Documented:指定该注解是否会在javadoc中体现

4> Inherited:子类会继承父类的注解

你可能感兴趣的:(Java基础,java,开发语言)