java中的枚举类型怎么定义?
public enum Path {PATH1("/home/acer/logs1"), PATH2("/home/acer/logs2"), PATH3("/home/acer/logs3"), PATH4("/home/acer/logs4");private String path;Path(String path) {this.path = path;}public String getPath() {return path;}//测试方法public static void main(String[] args) {System.out.println(Path.PATH1.getPath());System.out.println(Path.PATH2.getPath());System.out.println(Path.PATH3.getPath());System.out.println(Path.PATH4.getPath());}}
java没有enum吧,如果想用枚举类型的话,可以使用包含常量的接口例如public interface them{
int red = 1;
int yellow = 2;
int blue = 3;}
然后哪个类想用这些常量,就实现这个接口好了
你写的enum them {red,yellow,blue};是C++里面的语法
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。
4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。
了解了这些基本特性,我们来看看如何使用它们。
1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
for (Color c: Color.values())
System.out.println(“find value:” + c);
2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。
public enum Color {
Red,
Green,
Blue;
/*
*定义一个变量表示枚举值的数目。
*(我有点奇怪为什么sun没有给enum直接提供一个size方法).
*/
private static int number = Color.values().length ;
/**
* 随机返回一个枚举值
@return a random enum value.
*/
public static Color getRandomColor(){
long random = System.currentTimeMillis() % number;
switch ((int) random){
case 0:
return Color.Red;
case 1:
return Color.Green;
case 2:
return Color.Blue;
default : return Color.Red;
}
}
}
可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。
3.覆载(Override)toString, valueOf方法
前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。
….
public String toString(){
switch (this){
case Red:
return "Color.Red";
case Green:
return "Color.Green";
case Blue:
return "Color.Blue";
default:
return "Unknow Color";
}
}
….
这时我们可以看到,此时再用前面的遍历代码打印出来的是
Color.Red
Color.Green
Color.Blue
而不是
Red
Green
Blue.
可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。
4.使用构造函数
虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。
public enum Color {
Red("This is Red"),
Green("This is Green"),
Blue("This is Blue");
private String desc;
Color(String desc){
this.desc = desc;
}
public String getDesc(){
return this.desc;
}
}
这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。
要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。
5.实现特定的接口
我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
6.定义枚举值自己的方法。
前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
public enum Color {
Red {
public String toString(){
return "Color.Red";
}
},
Green {
public String toString(){
return "Color.Green";
}
},
Blue{
public String toString(){
return "Color.Blue";
}
};
}
从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。
总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个
人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。
static final通常跟的是一个int类型的常数,所以有时候可以用int型代替枚举
在有些时候需要输出这个枚举量的名字(比如January),上面的方法输出的是int值,用类的话可以把名字一起输出
总的来说前者消耗资源比较少,后者更符合枚举的定义
枚举的确是一个类,在JDK1.4及以前,没有enum这个用法,那时候都是使用类来建立的,在《Java编程思想》中介绍了一类写法(详见第三版的章节8.1.3群组常量);JDK5以后,enum被引入,本质上就是一个类,所以可以被继承,总体思路和第三版这个写法类似,只是换了个名字(《Java编程思想》第四版第19章专门讲这个)
补充:我把早期的例子给出吧,你看一下,这就是早期的枚举的方法:
public final class Month{
private String name;
private Month (String nm){name=nm;}
public String toString(){return name;}
public static final Month
JAN=new Month("January"),
FEB=new Month("February"),
MAR=new Month("March"),
APR=new Month("April"),
MAY=new Month("May"),
JUN=new Month("June"),
JUL=new Month("July"),
AUG=new Month("August"),
SEP=new Month("September"),
OCT=new Month("October"),
NOV=new Month("November"),
DEC=new Month("December");
public static final Month month[]={
JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
};
public static final Month number(int ord){
return month[ord-1];
}
//main
public static void main(String args[]){
Month m=Month.JAN;
System.out.println(m);
m=Month.number(12);
System.out.println(m);
System.out.println(m==Month.DEC);
System.out.println(m.equals(Month.DEC));
System.out.println(Month.month[3]);
System.out.println(Month.APR);
}
}
public enum sex{
male,female
} //枚举定义
//直接调用 sex.male
Java中BigDecimal的8种舍入模式是怎样的
java.math.RoundingMode:这是一种枚举类型,定义了很多常用的数据舍入方式。这个类用起来还是很比较复杂的,原因在于舍入模式,数据运算规则太多太多,不是数学专业出身的人看着中文API都难以理解,这些规则在实际中使用的时候在翻阅都来得及。在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍...
JAVA有哪些基本数据类型啊
回答:数据类型 数据类型就是对内存位置的抽象表达。程序员可以利用多种数据类型:某些由编程语言定义,某些由外部库定义,还有 些则由程序员来定义。很多编程语言都依赖于特定的计算机类型和对数据类型属性的具体编译实现,比如word和integer数据类型的大小等。另一方面, Java的虚拟机负责定义其内置数据类型的各方...
java+ee基于注解的装配如何实现注解?
ava EE 中的注解(Annotation)是在程序中使用元数据(metadata)的一种方式,它可以提供类、方法、属性等元素的额外信息,帮助程序员更方便地进行开发和维护。在基于注解的装配中,注解可以帮助我们自动装配(autowiring)各种组件和资源,减少了代码的冗余和耦合,提高了代码的可维护性和可读性。以下是一个...
JAVA是什么东西啊 什么意思啊?
Java编程语言的风格十分接近C++语言。Java继承了C++语言面向对象技术的核心,舍弃了C++语言中的指针(以引用取代)、运算符重载、多重继承(以接口取代)等成分,增加了自动垃圾收集功能用于回收不再被引用的对象所占据的内存空间。在J2SE1.5版本中Java又引入了泛型编程、类型安全的枚举、不定长参数和自动装\/拆箱等语言特性。
java的常用接口有哪些?
NullPointerException在所有的异常中是最受欢迎的,而Exception异常是在所有异常层次结构的顶部。4.java.util.ArrayList 一个实现数组的数据结构的类。这个类实现了List接口,是最受欢迎的Java集合类的成员,Arr ayList和Vector之间的差异是初学者常见的问题之一,它也经常在java面试中被问到。5.ava.util....
JAVA是什么意思?
25.一个类只有一个超类,但一个类能实现多个接口。Java中的一个重要接口:Cloneable 26.接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。 例:ActionListener 接口监听. 类似的API有:java.swing.JOptionPane java.swing.Timer java.awt.Tookit 27.对象clone:...
java都是学习什么课程?
当然,达到能够参与项目的能力之前个人一定要学会相应的基础知识 就从基础开始说起 Javase Java基础所包含的,Java零基础必备安装包、JavaSE301集、Java教程零基础2019、Java教程零基础2019(ava基础语法、面向对象、异常、数组、常用类、集合、IO流、线程、反射机等等)、XML、Tomcat服务器开发;JavaWeb前端...
visual studio code教程:基础使用和自定义设置
15、avaScript (ES6) Code Snippets (代码片段插件)用代码片段加快ES开发速度,例如输入imd可以自动生成如下代码。16、Project Manager (项目管理器插件)。简单的项目管理器,可以在你的编辑器中快速切换项目。17、Sort Lines (代码行排序插件)。这个插件可以对选中的代码行进行排序,也提供不区分大小写、...
易语言【窗口总在最前】,要求能在AVA这类的游戏里 也是最前的,不能...
先调整窗口层次 在时钟循环枚举所有可见窗口除自己外全部设置顶置为假 在用个时钟设置自己的窗口顶置为真 在不行就用dx
java该怎么自学?
在Servlet\/JSP的学习中,重头仍然是Servlet Documentation。Servlet API最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet\/JSP编程本质就是在反复调用这些类来通过 HTTP协议在Web Server和Brower之间交谈。另外对JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就...
达杰核糖: java没有enum吧,如果想用枚举类型的话,可以使用包含常量的接口例如public interface them{ int red = 1; int yellow = 2; int blue = 3;} 然后哪个类想用这些常量,就实现这个接口好了 你写的enum them {red,yellow,blue};是C++里面的语法
淮安市17873999594: java中的枚举类型指的是什么啊? - ?
达杰核糖: 在Java中,枚举类型本质上其实就是一个类,枚举中的常量都是该枚举类型的实例.虽然枚举类型有一些限制,比如不能再派生出子枚举类型,不能调用构造函数,不过我们仍然可以在枚举类型中定义构造函数、字段和方法
淮安市17873999594: java 什么叫枚举型? - ?
达杰核糖: enmu 全称:enumeration 他是一种规范它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念 枚举像一个类,又像一个数组.可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)
淮安市17873999594: java里怎么定义枚举类型名为”工程师”(Engineers) - ?
达杰核糖: 我还没听说过Java不支持枚举的~ //定义枚举 enum Engineers{ software, bmechanical, Electronics } //在Main方法中 Engineers[] ee=new Engineers[]{ Engineers.software, Engineers.bmechanical, Engineers.Electronics }; for(int i=0;i<ee.length;i++){ System.out.println(ee[i]); }
淮安市17873999594: java 枚举enum定义的方法与位置. - ?
达杰核糖: java枚举定义的方法: 1.原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu"; String FRI = "Fri"; String SAT = "Sat"; String SUN = "Sun"; } 2.使用...
淮安市17873999594: java中枚举类型作用是什么,初学java没看懂,请指点一二 - ?
达杰核糖: 枚举你就把他看做一个在list这堆数据里面找出想要数据的一只手,通常枚举的实例都从list这个类里面来实例,其作用说白了就是用来循环这个list(通常的使用目的),list里面存放的是一个类.所以用枚举而不是用像数组一样的数字下标
淮安市17873999594: 数组和枚举有什么区别? - ?
达杰核糖: 我是学java的,那就拿java来说吧,在java中数组是个对象,而定义枚举类型就是定义一个类,枚举类型本质上是类. 值得注意的是:数组存放的都是同一种类型的数据,但枚举可存放不同数据类型的数据.其次是枚举是值类型,数组是引用类型.
淮安市17873999594: 什么叫枚举型? - ?
达杰核糖: 一、类型定义类型定义的语法格式:type=;=;……=;二、枚举类型通过预定义列出所有值的标识符来定义一个有序集合,这些值的次序和枚举类型说明中的标识符的次序识一致的.枚举类型的形式:(标识符1,……,标识符n)例如: ...
淮安市17873999594: java 什么叫枚举型? - ?
达杰核糖: Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口.当我们在声明一个enum类型时,我们应该注意到enum类型有如...
淮安市17873999594: Java语言中的枚举类型如何使用? - ?
达杰核糖: Java语言中的枚举类型的使用方法如下: 用法一:常量;public enum Color {RED, GREEN, BLANK, YELLOW } 用法二:switch; enum Signal { GREEN, YELLOW, RED } public class TrafficLight { Signal color = Signal.RED; public void change() ...