1.直接定义常量

class Weekday {
//定义int常量
public static final int SUN = 0;
public static final int MON = 1;
public static final int TUE = 2;
public static final int WED = 3;
public static final int THU = 4;
public static final int FRI = 5;
public static final int SAT = 6;
//定义String常量
public static final String RED = "r";
public static final String GREEN = "g";
public static final String BLUE = "b";
}
public class Main {
public static void main(String[] args){
int day = 5;
String color = "a";
if(day == Weekday.FRI){
System.out.println(day);
}
if(color.equals(Weekday.BLUE)){
System.out.println(color);
}
}
}

直接定义常量的缺点:编译器无法检查常量的内容。常量发生改变,如r变成R,很多逻辑会报错。因此Java提供了枚举类型。

2.通过enum定义常量

  • 通过enum关键字可以定义常量类型
  • 常量本身带有类型信息
  • 使用 == 比较 if(day == Weekday.FRI){...}

enum定义的类型实际上是class:

  • enum继承自java.lang.Enum
  • 不能通过new创建实例
  • 所有常量都是唯一类型(引用类型):每个常量在JVM中是唯一的,因此可以使用==
  • 可以用于switch语句
public enum Weekday{
SUN,MON,TUE,WED,THU,FRI,SAT
}
public class Main {
public static void main(String[] args){
for(Weekday day:Weekday.values()){
//Weekday.value()获取所有常量的数组
System.out.println(day.name());//打印常量的name
}
Weekday fri = Weekday.FRI;//获取某个常量的引用类型
System.out.println("FRI.name() = " + fri.name());//获取name
System.out.println("FRI.ordinal() = " + fri.ordinal());//获取编号
System.out.println(Weekday.valueOf("FRI").name());//Weekday.valueOf(String)获取某个指定的常量
System.out.println(Weekday.valueOf("ABC"));
}

package com.csj2018.lxf;

public enum Weekday {
SUN("星期日"),
MON("星期一"),
TUE("星期二"),
WEN("星期三"),
THR("星期四"),
FRI("星期五"),
SAT("星期六");
private String chinese;
private Weekday(String chinese) {
this.chinese = chinese;
}
public String getChinese() {
return chinese;
} }
package com.csj2018.lxf;
import org.junit.Test; public class ForWeekday {
@Test
public void test() {
Weekday sun = Weekday.SUN;
System.out.println(sun.getChinese());
}
}

3. 总结:

  • enum可以定义常量类型,它被编译器编译为:final class Xxx extends Enum{...}
  • name()获取常量定义的字符串,注意不要使用toString(),toString()是可以被覆写的
  • ordinal()返回常量定义的顺序(无实质意义)
  • 可以为enum类编写构造方法、字段和方法。enum的构造方法必须是private
  • 构造方法申明为private

廖雪峰Java2面向对象编程-6Java核心类-5枚举类的更多相关文章

  1. 廖雪峰Java2面向对象编程-6Java核心类-3包装类型

    Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ...

  2. 廖雪峰Java2面向对象编程-6Java核心类-2StringBuilder

    字符串操作过程中,每次用 + 拼接字符串,有以下问题: 每次循环都会创建新的对象 绝大部分都是临时对象.浪费内存 影响GC效率 String s = ""; for(int i=0 ...

  3. 廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码

    Java的字符串用String表示 1.String特点: 可以直接使用"..."表示一个字符串,不强制使用new String 内容不可变 String s1 = "h ...

  4. 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类

    1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...

  5. 廖雪峰Java2面向对象编程-6Java核心类-4JavaBean

    1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { pr ...

  6. 廖雪峰Java2面向对象编程-3继承和多态-1继承

    1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...

  7. 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础

    1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...

  8. 廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar

    1.classpath 1.1classpath定义 classpath是一个环境变量 classpath指示JVM如何搜索class classpath设置的搜索路径与操作系统相关 * window ...

  9. 廖雪峰Java2面向对象编程-4抽象类和接口-2接口

    1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...

随机推荐

  1. Go Example--递归

    package main import "fmt" func main() { fmt.Println(fact(7)) } //函数的递归 func fact(n int) in ...

  2. Dynamic Code Evolution for Java dcevm 原理

    在hostswap dcevm中我们对Dynamic Code Evolution VM有了一个简单的了解,这篇文章将介绍Dynamic Code Evolution VM的实现原理. 有两个概念需要 ...

  3. goreplay 输出流量捕获数据到 elasticsearch

    goreplay 是一个很不错的流量拷贝,复制工具,小巧,支持一些扩展,当然也提供了企业版,企业版 功能更强大,支持二进制协议的分析 . 为了方便数据的存储,我们可以使用es 进行存储 环境准备 do ...

  4. 01 Linux简介

    1.Linux简介 UNIX与Linux发展史 Unix在1969年,美国贝尔实验室的肯汤普森在DEC PDP-7机器上开发出了UNIX系统. Linux出现于1991年,是由芬兰赫尔辛基大学学生李纳 ...

  5. webpack 3 升级到 webpack 4,遇到问题解决

    报错:Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead 解 ...

  6. virtualbox下centos虚拟机安装增强工具教程和常见错误解决

    VirtualBox 4.3.6上安装CentOS 6.5 https://my.oschina.net/tashi/blog/190060 错误1.Building the main Guest A ...

  7. 不同eclipse版本的git库使用

    在eclipse 4.4.2 -win32版本下编译好后上传版本: 1.在eclipse 4.4.0 -win64 版本下,编译报 缺少 sevlet.http...库,解决方法  project - ...

  8. NET设计模式 第二部分 结构性模式(11):外观模式(Façade Pattern)

    外观模式(Façade Pattern) ——.NET设计模式系列之十二 Terrylee,2006年3月 概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着 ...

  9. mac下安装、配置redies

    https://blog.csdn.net/qq_21383435/article/details/80676497 可视化客户端安装(Mac): ruby -e "$(curl -fsSL ...

  10. 【java】进制转换

    进制的表现形式: 十进制:0-9 ,满10 进1 八进制:0-7,满8进1,用0开头表示 十六进制:0-9,A-F,满16进1,用0x开头表示 十进制转换二进制: 原理:对十进制数进行除2运算,如37 ...