枚举
概念
枚举是一种特殊类。枚举是有固定实例个数的类型,我们可以把枚举理解成有固定个数实例的多例模式。
作用
一个方法接收的参数是固定范围之内的时候,那么即可使用枚举
枚举作用为限制输入的属性必须在所要求的范围之内,并且枚举只作为标记性作用,像一个flag一样
格式
enum 枚举名 {
第一行都是罗列枚举实例,这些枚举实例直接写大写名字即可。
}
入门案例
1.定义枚举:BOY表示男,GIRL表示女
enum Sex {
BOY, GIRL; // 男,女
}
2.Perosn中的性别有String类型改为Sex枚举类型
public class Person {
private String name;
private Sex sex;
public Person() {
}
public Person(String name, Sex sex) { this.name = name;
this.sex = sex; }
// 省略get/set/toString方法
}
3.使用是 只能传入枚举中的固定值
public class Demo{
psvm{
Person p1 = new Person("张三",Sex.BOY);
Person p2 = new Person("小红",Sex.GIRL);
Person p3 = new Person("李四","abc");
}
}
枚举本质是一个类,定义的Sex枚举最终效果如下
final class Sex extends java.lang.Enum<Sex> {
public static final Sex BOY;
public static final Sex GIRL;
private static final Sex[] $VALUES;
public static Sex[] values();
public static Sex valueOf(java.lang.String);
private Sex();
static {};
}
枚举其他内容
枚举中也可以有成员变量,成员方法,构造方法(构造方法缺省权限就是private,不能定义其他非私有权限)也可以去实现接口。
代码演示:在Sex中加入年龄的成员变量,并定义构造方法成员方法。
package com.liqiliang.demo11_enum;
public class Demo {
public static void main(String[] args) {
Sex.BOY.run();//只要足够努力,幸运就会不期而遇!
System.out.println(Sex.BOY.getAge());//20
}
}
enum Sex implements Run{
BOY(20),GIRL(22);
//可以给枚举定义其他成分:成员变量,成员方法,构造方法
//定义其他成分,必须在枚举常量后面
//成员变量
private int age;
/*必须有无参构造,否则报错
因为BOY,GIRL 本质上是对象,且调用枚举的无参构造
但是如果有成员变量的话,调用的就是有参构造 BOY(1),GIRL(2);
那么也可以没有无参构造器
*/
private Sex(){
}
Sex(int age) {
this.age = age;
}
public int getAge() {
return age;
}
// 枚举类中实现接口
@Override
public void run() {
System.out.println("只要足够努力,幸运就会不期而遇!");
}
}
interface Run{
void run();
}
拓展
枚举只是只是作为标记性作用,如果希望一个枚举有具体的值应该怎么做? 下面是我自己想出来的办法 , 但是存在弊端 , 对象的第二个参数本该为枚举类 , 现在成了String字符串 , 所以严谨性待定
package com.liqiliang.demo10;
public class Demo {
public static void main(String[] args) {
Person person = new Person("小明", Sex.BOY.getSex());
System.out.println(person);
Person person1 = new Person("小红", Sex.GRIL.getSex());
System.out.println(person1);
/*
Person{name='小明', sex='男'}
Person{name='小红', sex='女'}
*/
}
}
enum Sex{
BOY("男"),GRIL("女");
private String sex;
Sex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
class Person{
private String name;
private String sex;
public Person(String name, String sex) {
this.name = name;
this.sex = sex;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
唯有努力,人生没有白走的路,每一步都算数