文档库 最新最全的文档下载
当前位置:文档库 › 再谈在Java中使用枚举

再谈在Java中使用枚举

再谈在Java中使用枚举
再谈在Java中使用枚举

再谈在Java中使用枚举

从C++转到Java上的程序员一开始总是对Java有不少抱怨,其中没有枚举就是一个比较突出的问题。那么为什么Java不支持枚举呢?从程序语言的角度讲,支持枚举意味着什么呢?我们能不能找到一种方法满足C++程序员对枚举的要求呢?那么现在就让我们一起来探讨一下这个问题。

枚举类型(Enumerated Types)

让我们先看下面这一段小程序:

这种申明提供了一种用户友好的变量定义的方法,它枚举了这种数据类型所有可能的值,即星期一到星期天。抛开具体编程语言来看,枚举所具有的核心功能应该是:

◆类型安全(Type Safety)

◆紧凑有效的枚举数值定义(Compact, Efficient Declaration of Enumerated Values)

◆无缝的和程序其它部分的交互操作(Seamless integration with other language features)

◆运行的高效率(Runtime efficiency)

现在我们就这几个特点逐一讨论一下。

1.类型安全

枚举的申明创建了一个新的类型。它不同于其他的已有类型,包括原始类型(整数,浮点数等等)和当前作用域(Scope)内的其它的枚举类型。当你对函数的参数进行赋值操作的时候,整数类型和枚举类型是不能互换的(除非是你进行显式的类型转换),编译器将强制这一点。比如说,用上面申明的枚举定义这样一个函数:

如果你用整数来调用这个函数,编译器会给出错误的。

如果按照这个标准,那么Pascal, Ada, 和C++是严格意义上的支持枚举,而C语言都不是。

2. 紧凑有效的枚举数值定义

定义枚举的程序应该很简单。比如说,在Java中我们有这样一种“准枚举”的定义方法:

这种定义就似乎不够简洁。如果有大量的数据要定义,这一点就尤为重要,你也就会感受更深。虽然这一点不如其他另外3点重要,但我们总是希望申明能尽可能的简洁。

3.无缝的和程序其它部分的交互操作

语言的运算符,如赋值,相等/大于/小于判断都应该支持枚举。枚举还应该支持数组下标以及witch/case语句中用来控制流程的操作。比如:

要想让这段程序工作,那么枚举必须是整数常数,而不能是对象(objects)。Java 中你可以用equals() 或是compareTo()函数来进行对象的比较操作,但是它们都不支持数组下标和switch语句。

#p#

4. 运行的高效率

枚举的运行效率应该和原始类型的整数一样高。在运行时不应该由于使用了枚举而导致性能比使用整数有所下降。如果一种语言满足这四点要求,那么我们可以说这种语言是真正的支持枚举。比如前面所说的Pascal,Ada,和C++。很明显,Java不是。

Java的创始人James Gosling是个资深的C++程序员,他很清楚什么是枚举。但似乎他有意的删除了Java的枚举能力。其原因我们不得而知。可能是他想强调和鼓励使用多态性(polymorphism),不鼓励使用多重分支。而多重分支往往是和枚举联合使用的。不管他的初衷如何,我们在Java中仍然需要枚举。

Java中的几种“准枚举”类型

虽然Java不直接支持用户定义的枚举。但是在实践中人们还是总结出一些枚举的替代品。

第一种替代品可以解释为“整数常数枚举”。如下所示:

这种方法可以让我们使用更有意义的变量名而不是直接赤裸裸的整数值。这样使得源程序的可读性和可维护性更好一些。这些定义可以放在任何类中。可以和其它的变量和方法混在一起。也可以单独放在一个类中。如果你选择将其单独放在一个类中,那么引用

的时候要注意语法。比如“Day.MONDAY.”。如果你想在引用的时候省一点事,那么你可以将其放在一个接口中(interface),其它类只要申明实现(implement)它就可以比较方便的引用。比如直接使用MONDAY。就Java接口的使用目的而言,这种用法有些偏,不用也罢!

这种方法显然满足了条件3和4,即语言的集成和执行效率(枚举就是整数,没有效率损失)。但是他却不能满足条件1和2。它的定义有些啰嗦,更重要的是它不是类型安全的。这种方法虽然普遍被Java程序员采用,但它不是一种枚举的良好替代品。

第二种方法是被一些有名的专家经常提及的。我们可以称它为“对象枚举”。即为枚举创建一个类,然后用公用的该类的对象来表达每一个枚举的值。如下所示:

枚举值被定义为公用静态对象(public static object)。此外该类含有私有构造函数;一个循环器(Iterator)用以遍历所有的值;一些Java中常用的函数,如toString(),equals()和compareTo(),以及一些方便客户程序调用的函数,如ord(),prev(),next(),first()和last()。

这种实现方法有很好的类型安全和运行效率(条件1和4)。但是却不满足条件2和3。首先它的定义比较繁琐,大多数程序员也许因为这个而不去使用它;同时他还不可以被用作数组下标或是用在switch/case语句。这在一定程度上降低了他的使用的广泛性。

看起来,没有一种替代品是理想的。我们虽然没有权利修改Java语言,但是我们也许可以想一些办法来克服“对象枚举”的缺点,使它成为合格的枚举替代品。

#p#

一个实现枚举的微型语言(A Mini-Language for Enums)

假如我发明一种枚举专用的微型语言(且叫它jEnum),它专门用来申明枚举。然后我再用一个特殊的“翻译”程序将我用这种语言定义的枚举转化为对应的“对象枚举”定义,

那不是就解决了“对象枚举”定义复杂的问题了吗。当然我们很容易让这个“翻译”程序多做一些工作。比如加入Package申明,加入程序注释,说明整数值和该对象的字符串标签名称等等。让我们看下面这样一个例子:

虽然“整数常数枚举”在有些情况下优点比较显著。但是总体上讲“对象枚举”提供的类型安全还是更为重要的,相比之下那些缺点还是比较次要的。下面我们大概讲一下jEnum,使用它我们又可以得到紧凑和有效的枚举申明这一特点,也就是我们前面提到的条件2。

熟悉编译器的朋友可能更容易理解下面这一段jEnum微型语言。

这种语法允许在开始申明package,看起来和Java语言还挺像。你可以增加一些javadoc的注解,当然这不是必须的。枚举类型的申明以关键字“enum”开头,枚举的值放在花括号中{},多个值之间用逗号分开。每一个值的申明包括一个标准的Java变量名,一个可选的字符串标签,可选的等号(=)和一个整数值。

如果你省略了字符串标签,那么枚举的变量名就会被使用;如果你省略了等号和后面的

整数值,那么它将会自动按顺序给你的枚举赋值,如果没有使用任何数值,那么它从零开始逐步增加(步长为1)。字符串标签作为toString()方法返回值的一部分,而整数值则作为ord()方法的返回值。如下面这段申明:

RED 的标签是 "Red",值为 2 ;

WHITE的标签是"White",值为4;

BLUE的标签是"BLUE" ,值为5 。

要注意的是在Java中的保留字在jEnum也是保留的。比如你不可以使用this作为package名,不可以用for为枚举的变量名等等。枚举的变量名和字符串标签必须是不同的,其整数值也必须是严格向上增加的,象下面这段申明就是不对的,因为它的字符串标签不是唯一的。

下面这段申明也是不对的,因为WHITE会被自动赋值2,和BLUE有冲突。

下面这是一个具体的实例。它将会被“翻译”程序使用,用以转换成我们枚举申明为可编译的Java源程序。

如果对Day的枚举申明存放在Day.enum文件中,那么我们可以将这个文件翻译成Java源程序。

$ java -jar jEnum.jar Day.enum

翻译的结果就是Day.java,Java源程序,内容和我们前面讲的一样,还包括程序注释等内容。如果想省一点事,你可以将上面比较长的命令写成一个批处理文件或是Unix,Linux上的shell script,那么以后使用的时候就可以简单一些,比如:

$ jec Day.enum

关于jEnum有四点注意事项要说明一下。

1.申明文件名不一定后缀为“.enum.”,其它合法文件后缀都可以。

2.如果文件后缀不是“.enum.”,那么翻译程序将首先按给出的文件名去搜索,如果没有,就假定给出的文件名是省略了“.enum.”后缀的。像这种命令是可以的:

$ java -jar jEnum.jar Day

3.生成的Java源程序文件名是按照申明文件内的定义得出的,而不是依据申明文件的名称。

4.翻译程序还接受以下几个开关

-o 生成“对象枚举”类枚举,是缺省值

-c 生成“整数常数枚举”类枚举,用类来实现

-i 生成“整数常数枚举”类枚举,用接口来实现

要注意的是,-C开关虽然生成“整数常数枚举”,但它同时还提供了一些“对象枚举”中所具有的方法,如first(),last(),toString(int n),prev(int n)和next(int

n)。

(责任编辑火凤凰 sunsj@https://www.wendangku.net/doc/c36810865.html, TEL:(010)68476636-8007)

全面掌握java枚举类型

枚举类型是JDK5.0的新特征。Sun引进了一个全新的关键字enum来定义一个枚举类。下面就是一个典型枚举类型的定义: Java代码 1.public enum Color{ 2. RED,BLUE,BLACK,YELLOW,GREEN 3.} 显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类。而这些类都是类库中Enum类的子类(https://www.wendangku.net/doc/c36810865.html,ng.Enum)。它们继承了这个Enum中的许多有用的方法。下面我们就详细介绍enum定义的枚举类的特征及其用法。(后面均用Color举例) 1、Color枚举类是特殊的class,其枚举值(RED,BLUE...)是Color的类对象(类实例): Color c=Color.RED; 而且这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。 2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同: (1) 构造器只是在构造枚举值的时候被调用。 Java代码 1.enum Color{ 2. RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(2 55,255,0),GREEN(0,255,0); 3. //构造枚举值,比如RED(255,0,0) 4. private Color(int rv,int gv,int bv){ 5. this.redValue=rv; 6. this.greenValue=gv; 7. this.blueValue=bv; 8. } 9. 10. public String toString(){ //自定义的public方 法 11. return super.toString()+"("+redValue+","+greenVa lue+","+blueValue+")"; 12. } 13. 14. private int redValue; //自定义数据域,private为 了封装。 15. private int greenValue;

java29常用类之Enum(枚举类)

Enum类 Enum枚举类就是class,而且是一个不可以被继承的final类。(后面均用Color举例)。 其枚举值(RED,BLUE...)都是Color类型的类静态常量,我们可以通过下面的方式来得到Color枚举类的一个实例: Color c=Color.RED; 注意:这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。 1、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同,不能使用public的构造函数,只能使用private的构造函数,这样可以保证外部代码无法新构造枚举类的实例。 2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。 3.Enum默认实现了https://www.wendangku.net/doc/c36810865.html,parable接口。 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 Color.BLUE.ordinal(); //返回结果:1 8.equals()方法:比较两个枚举类对象的引用。 public final boolean equals(Object other) { return this==other; } https://www.wendangku.net/doc/c36810865.html,pareTo()方法: Enum实现了https://www.wendangku.net/doc/c36810865.html,parable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。 https://www.wendangku.net/doc/c36810865.html,pareTo(Color.BLUE); //返回结果-1 10.枚举类可以在switch语句中使用。 Color color=Color.RED; switch(color){ case RED: System.out.println("it's red");break; case BLUE: System.out.println("it's blue");break; case BLACK: System.out.println("it's blue");break; } 枚举类的定义: 例1: public class TestEnum { //只能是三种颜色之一

java枚举类型

java枚举类型 public class TestEnum { /*最普通的枚举*/ public enum ColorSelect { red, green, yellow, blue; } /* 枚举也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样. */ public enum Season { // 枚举列表必须写在最前面,否则编译出错 winter, spring, summer, fall; private final static String location = "Phoenix"; public static Season getBest() { if (location.equals("Phoenix")) return winter; else return summer; } } /*还可以有构造方法*/ public enum Temp { /*通过括号赋值,而且必须有带参构造器和一属性跟方法,否则编译出错 * 赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值 * 如果不赋值则不能写构造器,赋值编译也出错*/ absoluteZero(-459), freezing(32),boiling(212), paperBurns(451); private final int value; public int getValue() { return value; } //构造器默认也只能是private, 从而保证构造函数只能在内部使用 Temp(int value) { this.value = value; } } public static void main(String[] args) { /* * 枚举类型是一种类型,用于定义变量,以限制变量的赋值赋值时通过"枚举名.值"来取得相

JAVA类成员

static 关键字修饰的成员就是类成员,前面已经介绍的类成员有类属性、类方法、静态初始化块等三个成分,static关键字不能修饰构造器。static修饰的类成员属于整个类,不是属于单个实例的。 在JA V A类里只能包含属性,方法,构造器,初始化块,内部类和枚举类等六种成员,也包含了接口,目前已经介绍了前面四种,其中static可以修饰属性,方法,初始化块,内部类和枚举类,以static修饰的成员就是类成员,类成员属于整个类,而不是属于单个对象。 我们要知道,当系统第一次准备使用该类时,系统会为该类属性分配内存空间,类属性开始生效,直到该类被卸载,该类的类属性怕占有的内存才被系统的垃圾回收机制回收。类属性生存范围几乎等同于该类的生存范围,当类初始化完成后,类属性也被初始化完成。 类属性既可通过类来访问,也可通过类的对象来访问。但通过类的对象来访问类属性时,实际上并不是访问该对象所具有的属性。当通过对象来访问类属性时,系统会在底层转换让为通过该类来访问类属性。 由于所有对象实际上并不保持类属性,类属性是由该类来保持的,同一个类的所有对象访问类属性时,实际上访问的是该类所持有的属性。因此从程序运行表面上来看,即可看到同一类的所有实例的类属性共享同一块内存区。 类方法也是类成员的一种,类方法也是属于类的,通常直接使用类作为调用类方法,但也可以使用对象来调用类方法。与类属性类似的,即使使用对象来调用类方法,其效果与采用类来调用类方法完全一样。 当使用实例来访问类成员时,实际依然委托给该类来访问类成员,因此即使某个实例为Null它也可以访问它所属类的类成员。

本来是不想写太多的概念性的东西的,但为了大家能更好的理解写出来的代码,所以还是麻烦下自已写出来。 看代码: public class NullAccessStatic { private static void test() { System.out.println("static修饰的类方法"); } //主方法入口 public static void main(String[] args) { //定义一个NullAccessStatic变量,其值为:null NullAccessStatic nas = null; //null对象调用所属类的静态方法 nas.test(); } }

Java

基本语法 编写Java程序时,应注意以下几点: ?大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的。 ?类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass 。 ?方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。 ?源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。(如果文件名和类名不相同则会导致编译错误)。 ?主方法入口:所有的Java 程序由public static void main(String []args)方法开始执行。 Java标识符 Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。 关于Java标识符,有以下几点需要注意: ?所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始 ?首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或数字的任何字符组合 ?关键字不能用作标识符 ?标识符是大小写敏感的 ?合法标识符举例:age、$salary、_value、__1_value ?非法标识符举例:123abc、-salary

Java修饰符 像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符: ?访问控制修饰符: default, public , protected, private ?非访问控制修饰符: final, abstract, strictfp 在后面的章节中我们会深入讨论Java修饰符。 Java变量 Java中主要有如下几种类型的变量 ?局部变量 ?类变量(静态变量) ?成员变量(非静态变量) Java数组 数组是储存在堆上的对象,可以保存多个同类型变量。在后面的章节中,我们将会学到如何声明、构造以及初始化一个数组。 Java枚举 Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。 例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。 实例

java 枚举和注解

1. 枚举类的说明: * 1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类* 2.当需要定义一组常量时,强烈建议使用枚举类 * 3.如果枚举类中只一个对象,则可以作为单例模式的实现方式。 2. 如何自定义枚举类?步骤: //自定义枚举类 class Season{ //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.其他诉求1:提供toString() @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }

第8周 枚举 泛型 常用类(西南交大)

/*通过getValue()取得相关枚举的值*/ System.out.println(t+"的值是"+t.getValue()); } } } 要求: (1)分析该程序,写出运行结果 【实验结果与分析】 图1 运行结果 分析:该程序主要应用了泛型和枚举的知识点。 2、编辑、编译、运行下面java程序 class Gen { private T ob; //定义泛型成员变量 public Gen(T ob) { this.ob = ob; } public T getOb() { return ob; }

public void setOb(T ob) { this.ob = ob; } public void showTyep() { System.out.println("T的实际类型是: " + ob.getClass().getName()); } } public class GenDemo { public static void main(String[] args){ //定义泛型类Gen的一个Integer版本 Gen intOb=new Gen(88); intOb.showTyep(); int i= intOb.getOb(); System.out.println("value= " + i); System.out.println("----------------------------------"); //定义泛型类Gen的一个String版本 Gen strOb=new Gen("Hello Gen!"); strOb.showTyep(); String s=strOb.getOb(); System.out.println("value= " + s); } } 要求: (1)分析该程序,写出运行结果 【实验结果与分析】 图2 运行结果 分析:该程序继续考察泛型的应用。 _________________________________________________________________________________ 3、编辑并运行下面程序,理解Date、SimpleDateFormat类的使用 用Data类不带参数的构造方法创建日期,要求日期的输出格式是:星期小时分秒import java.util.*;

Java枚举类型

Java枚举类型入门 这里就将为大家谈谈Java枚举类型,static final通常跟的是一个int类型的常数,所以有时候可以用int型代替枚举。在Java中,枚举确实是一个类。 Tiger中的一个重要新特性是枚举构造,它是一种新的Java枚举类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。Tiger 专家、developerWorks 的多产作者Brett McLaughlin将解释枚举的定义,介绍如何在应用程序中运用枚举,以及它为什么能够让您抛弃所有旧的public static final 代码。 您已经知道,Java 代码的两个基本的构造块是类和接口。现在Tiger 又引入了枚举,一般简称它为enum。这个新类型允许您表示特定的数据点,这些数据点只接受分配时预先定义的值集合。当然,熟练的程序员可以用静态常量实现这项功能,如清单 1 所示:清单 1. public static final 的常量 1.public class OldGrade { 2. 3.public static final int A = 1; 4.public static final int B = 2; 5.public static final int C = 3; 6.public static final int D = 4; 7.public static final int F = 5; 8.public static final int INCOMPLETE = 6; 9.} 说明:我要感谢O'Reilly 媒体公司,该公司允许在本文中使用我撰写的Java 1.5 Tiger:A Developer's Notebook 一书中“枚举”这一章中的代码示例(请参阅参考资料)。 然后您就可以让类接受像OldGrade.B 这样的常量,但是在这样做的时候,请记住这类常量是Java 中int 类型的常量,这意味着该方法可以接受任何int 类型的值,即使它和OldGrade 中定的所有级别都不对应。因此,您需要检测上界和下界,在出现无效值的时候,可能还要包含一个IllegalArgumentException。而且,如果后来又添加另外一个级别(例如OldGrade.WITHDREW_PASSING),那么必须改变所有代码中的上界,才能接受这个新值。 换句话说,在使用这类带有整型常量的类时,该解决方案也许可行,但并不是非常有效。幸运的是,枚举提供了更好的方法。 定义枚举清单 2 使用了一个可以提供与清单 1 相似的功能的枚举: 清单 2. 简单的枚举类型

java中枚举类型enum的定义

枚举类型的定义enum Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。 1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum 的实例。 2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。 3.Enum默认实现了https://www.wendangku.net/doc/c36810865.html,parable接口。 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增加一个方法随机返回一个颜色。

JAVA复习题

1、简述Java实现可移值性的基本原理。 答:Java属于编译型和解释型的编程语言,所有的*.java程序必须编译为*.class文件之后才可以在电脑上执行,而执行*.class文件的电脑并不是一台真实的电脑,而是利用软件和硬件模拟出来的一台虚拟电脑,称为Java虚拟机,而针对于不同的操作系统平台,有不同版本的Java虚拟机,即:由Java 虚拟机去适应不同的操作系统,即:只要Java虚拟机的支持没有改变,同一个*.class可以在不同的平台上运行。 2、简述Java语言的三个程序分支。 答:JAVA SE(Java标准版):提供基础的Java类库及平台支持: JAVA ME(Java微型版):提供嵌入式开发支持: JAVA EE(Java企业版):提供企业平台支持。 3、简述Java中path及classpath的作用。 CLASSPATH:是所有*.class文件的执行路径,java命令执行的时候将利用此路径加载所需要的*.class 文件。 4、简述Java语言的主要特点。 答:Java语言的主要的特点如下: 1、Java语言是一门面向对象语言,且语法足够简单; 2、Java避免了C/C++之中复杂的指针关系,而使用了更为简单的引用方式来进行内存传递; 3、Java是为数不多的支持多线程开发的编程语言; 4、Java提供了自动的垃圾收集机制,可以定期释放出无用的垃圾空间; 5、Java语言的安全性较高; 6、Java最大的特点是具备可移植性,即:同一个程序在不同的操作系统上都可以运行。5、详细阐述Java中使用public class或class声明一个类的区别及注意事项。 答:使用public class定义的类,要求文件名称和类名称保持一致,在一个*.java文件之中只能存在一个public class;使用class定义的类,文件名称可以和类名称不一致,在一个*.java文件之中可以同时存在多个class定义,编译之后会产生多个*.class文件。 1、请解释常量与变量的区别? 答:常量就是一个固定的数值。是不可改变的,例如:数字1、2就是一个整型的常量。 变量是利用声明的方式,将内存中的某个内存块保留下来以供程序使用。可以声明的数据类型为整型、字符型、浮点型或是其他数据类型,作为变量的保存之用。变量在程序语言中扮演了最基本的角色。变量可以用来存放数据,而使用变量之前必须先声明它的数据类型。 2、解释方法重载的概念,并举例说明。 答:方法重载指的是多个方法的方法名称相同,但是方法中的参数类型及个数不同。 代码说明: public static int add(int x, int y) { return x + y; } public static int add(int x, int y, int z) { return x + y + z; } public static double add(double x, double y) { return x + y; } 1、String类的操作特点。 答:String类的对象有两种实例化方式: |- 方式一:直接赋值,只开辟一块堆内存空间,并且对象可以入池;

JAVA中ENUM类型详解

JAVA中ENUM类型详解 Enum类型的介绍 枚举类型(Enumerated Type)很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中。而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围。 举个例子来说明一下,如果希望为彩虹描绘出七种颜色,你可以在Java 程序中通过常量定义方式来实现。 清单1. 常量定义 Public static class RainbowColor { // 红橙黄绿青蓝紫七种颜色的常量定义 public static final int RED = 0; public static final int ORANGE = 1; public static final int YELLOW = 2; public static final int GREEN = 3; public static final int CYAN = 4; public static final int BLUE = 5; public static final int PURPLE = 6; } 使用的时候,你可以在程序中直接引用这些常量。但是,这种方式还是存在着一些问题。 1、类型不安全 由于颜色常量的对应值是整数形,所以程序执行过程中很有可能给颜色变量传入一个任意的整数值,导致出现错误。 2、没有命名空间 由于颜色常量只是类的属性,当你使用的时候不得不通过类来访问。 3、一致性差 因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。 4、类型无指意性 由于颜色枚举值仅仅是一些无任何含义的整数值,如果在运行期调试时候,你就会发现日志中有很多魔术数字,但除了程序员本身,其他人很难明白其奥秘。 如何定义Enum类型 为了改进Java 语言在这方面的不足弥补缺陷,5.0 版本SDK 发布时候,在语言层面上增加了枚举类型。枚举类型的定义也非常的简单,用enum关键字加上名称和大括号包含

JAVA中的枚举类型1:基本用法

枚举是Java 5开始支持的新特性,其作用是将一组相关的常量定义在一个类型中,这样在使用时就只能使用这些有限的常量。先定义一个代表一周七天的枚举类型作为范例: Java代码 1.enum Weekday { 2. SUNDAY, MONDAY, TUESDAY, WEDNSDAY, THURSDAY, FRIDAY, SATURD AY 3.}; 这样就定义好了一个Weekday枚举类型,注意最后的分号是可以省略的。因为Weekday中只有7个成员,所以Weekday的变量只能取其中一个值,例如: Java代码 1.Weekday wd = Weekday.MONDAY; 这样看起来枚举类型似乎很简单,其实它本质上是一个类,其隐含的父类是https://www.wendangku.net/doc/c36810865.html,ng.Enum,所以Weekday自动继承了Enum的方法,其中有两个挺有用,一个叫ordinal(),返回成员的声明顺序编号,这是一个整数,值从0开始编号,比如Weekday.SUNDAY.ordinal()返回0,而Weekday.MONDAY.ordinal()返回1。另一个方法叫做name(),返回枚举成员的名称。 更有意思的是,枚举类型可以直接用于switch语句,这个功能看起来是突破了Java中switch只能用于整数和字符的限制,不过其实是Java编译器的障眼法,Java编译器会自动在枚举成员上调用ordinal()方法,例如: Java代码 1.Weekday wd = Weekday.FRIDAY; 2.switch (wd) { 3.case MONDAY: 4. System.out.println("这个星期才刚开始,慢慢等吧"); 5. break; 6.... 7.case FRIDAY: 8. System.out.println("周末来了,好好享受吧"); 9. break; 10.... 11.}

java试题

1.下面关于枚举的描述正确的一项是? A. 枚举中定义的每一个枚举项其类型都是String; B. 在Java中可以直接继承java.util.Enum类实现枚举类的定义; C. 利用枚举类中的values()方法可以取得全部的枚举项; D. 枚举中定义的构造方法只能够使用private权限声明; 答案:C 2.String和Object类在那个包中定义的? A. https://www.wendangku.net/doc/c36810865.html,ng B. java.util C. https://www.wendangku.net/doc/c36810865.html, D. java.sql 答案:A 3.定义类时不可能用到的关键字是? A. final B. public C. protected D. static 解析:可以修饰类的修饰符有public,static,final和abstract。所以答案:C 4.下列关于包、类和源文件的描述中,不正确的一项是? A. 一个包可以包含多个类 B. 一个源文件中,只能有一个public class C. 属于同一个包的类在默认情况不可以互相访问,必须使用import导入 D. 系统不会为源文件创建默认的包

答案:C 5.下面对于多态性的描述,错误的一项是? A. 面向对象多态性描述的就是对象转型的操作 B. 对象可以自动实现向上转型; C. 对象的向下转型需要强制转型 D. 可以利用instanceof方法判断某一个对象是否属于某个类的实例答案:A 6.现在有如下一段程序: class Happy { public static void main(String args[]) { float [][] f1 = {{1.2f,2.3f},{4.5f,5.6f}} ; Object oo = f1 ; f1[1] = oo ; System.out.println("Best Wishes "+f1[1]); } } 运行该程序会出现什么结果? A. {4.5,5.6} B. 4.5 C. compilation error in line NO.5 D. exception 答案:C 7.下列说法正确的一项是? A. https://www.wendangku.net/doc/c36810865.html,ng.Integer是接口

enum枚举java【java,enum(枚举)使用详解+,总结】

enum枚举java【java,enum(枚举)使用详解+,总 结】 enum的全称为enumeration,是JDK1.5中引入的新特性,存放在https://www.wendangku.net/doc/c36810865.html,ng包中。 原始的接口定义常量 语法(定义) 创建枚举类型要使用enum关键字,隐含了所创建的类型都是https://www.wendangku.net/doc/c36810865.html,ng.Enum类的子类(https://www.wendangku.net/doc/c36810865.html,ng.Enum是一个抽象类)。枚举类型符合通用模式ClassEnum 这段代码实际上调用了7次Enum(Stringname,intordinal): 遍历、switch等常用操作 对enum进行遍历和switch的操作示例代码: 输出结果: enum对象的常用方法介绍 intcompareTo(Eo) 比较此枚举与指定对象的顺序。 ClassgetDeclaringClass() 返回与此枚举常量的枚举类型相对应的Class对象。 Stringname() 返回此枚举常量的名称,在其枚举声明中对其进行声明。

intordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 StringtoString() 返回枚举常量的名称,它包含在声明中。 static 输出结果: 给enum自定义属性和方法 给enum对象加一下value的属性和getValue()的方法: 输出结果: EnumSet,EnumMap的应用 原理分析 enum的语法结构尽管和class的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了https://www.wendangku.net/doc/c36810865.html,ng.Enum。EnumTest经过反编译(javapcom.hmw.test.EnumTest命令)之后得到的内容如下:48f0d266f44.png"data-size="undefined"/> 所以,实际上enum就是一个class,只不过java编译器帮我们做了语法的解析和编译而已。 总结

Java枚举数据类型

1.背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏天,3表示秋天,4表示冬天。 ? 这种方法称作int枚举模式。可这种模式有什么问题呢,我们都用了那么久了,应该没问题的。通常我们写出来的代码都会考虑它的安全性、易用性和可读性。首先我们来考虑一下它的类型安全性。当然这种模式不是类型安全的。比如说我们设计一个函数,要求传入春夏秋冬的某个值。但是使用int类型,我们无法保证传入的值为合法。代码如下所示:

程序getChineseSeason(Season.SPRING)是我们预期的使用方法。可getChineseSeason(5)显然就不是了,而且编译很通过,在运行时会出现什么情况,我们就不得而知了。这显然就不符合Java程序的类型安全。 接下来我们来考虑一下这种模式的可读性。使用枚举的大多数场合,我都需要方便得到枚举类型的字符串表达式。如果将int枚举常量打印出来,我们所见到的就是一组数字,这是没什么太大的用处。我们可能会想到使用String常量代替int常量。虽然它为这些常量提供了可打印的字符串,但是它会导致性能问题,因为它依赖于字符串的比较操作,所以这种模式也是我们不期望的。从类型安全性和程序可读性两方面考虑,int和String枚举模式的缺点就显露出来了。幸运的是,从Java1.5发行版本开始,就提出了另一种可以替代的解决方案,可以避免int和String枚举模式的缺点,并提供了许多额外的好处。那就是枚举类型(enum type)。接下来的章节将介绍枚举类型的定义、特征、应用场景和优缺点。 2.定义 枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java中由关键字enum来定义一个枚举类型。下面就是java枚举类型的定义。 ? 3.特点 Java定义枚举类型的语句很简约。它有以下特点: 1) 使用关键字enum 2) 类型名称,比如这里的Season 3) 一串允许的值,比如上面定义的春夏秋冬四季4) 枚举可以单独定义在一个文件中,也可以嵌在其它Java类中。 除了这样的基本要求外,用户还有一些其他选择 5) 枚举可以实现一个或多个接口(Interface)6) 可以定义新的变量7) 可以定义新的方法8) 可以定义根据具体枚举值而相异的类 4.应用场景 以在背景中提到的类型安全为例,用枚举类型重写那段代码。代码如下:

java枚举学习

DK1.5引入了新的类型——枚举。在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便。 用法一:常量 在JDK1.5之前,我们定义常量都是:publicstaticfianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 Java代码 1.public enum Color { 2. RED, GREEN, BLANK, YELLOW 3.} 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。 Java代码 1.enum Signal { 2. GREEN, YELLOW, RED 3.} 4.public class TrafficLight { 5. Signal color = Signal.RED; 6. public void change() { 7. switch (color) { 8. case RED: 9. color = Signal.GREEN; 10. break ; 11. case YELLOW: 12. color = Signal.RED; 13. break ; 14. case GREEN: 15. color = Signal.YELLOW;

16. break ; 17. } 18. } 19.} 用法三:向枚举中添加新方法 如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且Java要求必须先定义enum实例。 Java代码 1.public enum Color { 2. RED("红色" , 1 ), GREEN( "绿色" , 2 ), BLANK( "白色 " , 3 ), YELLO( "黄色" , 4 ); 3. // 成员变量 4. private String name; 5. private int index; 6. // 构造方法 7. private Color(String name, int index) { 8. this .name = name; 9. this .index = index; 10. } 11. // 普通方法 12. public static String getName( int index) { 13. for (Color c : Color.values()) { 14. if (c.getIndex() == index) { 15. return https://www.wendangku.net/doc/c36810865.html,; 16. } 17. } 18. return null ; 19. } 20. // get set 方法 21. public String getName() { 22. return name; 23. } 24. public void setName(String name) {

JAVA枚举类型的用法

JA V A枚举类型的用法 1 枚举类型等效于定义static finally 常量 2. 枚举类型可以有自己的属性(参数)和方法 3. 枚举类型可以以独立的文件存在 最简单的枚举类型: public enum Belle { para1, para2, para3, para4; } 调用: for (Belle belle : Belle.values()) { //遍历枚举中所有的对象 System.out.println(https://www.wendangku.net/doc/c36810865.html,()); //输出每一个枚举的名称 } 要取出某个指定名称的枚举成员可用Belle.para1(注意:因为枚举对象默认是static final 其成员对象都是stastic 属性,直接调用),也可以用Belle.valueOf("para1") 稍复杂的枚举类型: public enum Belle { para1("this is para1"), para2("this is para3"), para3("this is para3"), para4("this is para4"); public final String str; //定义枚举成员属性 Belle(String str) { //内部方法设定枚举成员属性 this.str = str; } } 这样就每一个枚举成员就有了属性,可以定义多个属性,每个属性必须在内部方法中set(例如this.str = str;) 调用时用这样的格式取值belle.str 枚举成员就的属性可以不光是字符串,可以是任意对象 更复杂的枚举类型: public enum Belle { para1("this is para1") { public String event() { //实现枚举成员的方法 return "i am a mtthod of para1";

Java期末复习题全

第一部分 Java语言概述 1选择题 1-1在下列概念中,Java语言只保留了。 A. 运算符重载 B. 方法重载 C. 指针 D. 结构和联合 1-2下列关于Java语言特征的描述中,错误的是。 A. 支持多线程操作 B. Java 程序与平台无关 C. Java程序可以直接访问Internet上的对象 D. 支持但继承和多继承 1-3 下列关于Java Application 程序在结构上特点的描述中,错误的是。 A. Java程序是由一个或多个类组成的 B. 组成Java程序的若干个类可以放在一个文件中,也可以放在多个文件中 C. Java 程序的文件名要与某个类名相同 D. 组成Java程序的多个类中,有且仅有一个主类 1-4Java程序经过编译后生成的文件的后缀是。 A..obj B..exe C. .class D. .java 1-5下列关于运行字节码文件的命令行参数的描述中,正确的是。 A.第一个命令行参数(紧跟命令字的参数)被存放在args[0]中。 B.第一个命令行参数被存放在args[1]中。 C.命令行的命令字被存放在args[0]中。 D.数组args[]的大小与命令行参数的个数无关。 2.判断题 1-1Java语言是在C++语言之前问世的。() 1-2Java语言具有较好的安全性和可移植性及与平台无关等特性。() 1-3Java语言中取消了联合概念,保留了结构概念。() 1-4Java语言中数据类型占内存字节数与平台无关。() 1-5Java语言中可用下标和指针两种方式表示数组元素。() 1-6Java语言的源程序不是编译型的,而是编译解释型的。() 1-7操作系统中进程和线程两个概念是没有区别的。() 1-8Java语言既是面向对象的又是面向网络的高级语言。() 1-9Java程序分为两大类:一类是Application 程序,另一类是Applet程序。前者又称Java应用程序,后者又称Java小应用程序。() 1-10JavaApplication程序是由多个文件组成的,其中可以有也可以没有主文件。() 1-11组成JavaApplication的若干类中,有且仅有一个主类,只有主类中含有主方法main( )_。() 1-12JavaApplication程序中,必有一个方法main( ),该方法有没有参数都可以。() 1-13Java程序中是不区分大小写字母的。() 1-14下列两个命令:javac 和java是不同的,编译时用前者,运行时用后者。() 1-15Java程序编译后生成的是字节码文件,其后缀是 .exe。() 1-16字节码文件机器是不能直接识别的,它要经过解释器,边解释边执行。() 1-17在Java程序中,使用import语句引入类是在解释器中实现的。() 1-18在运行字节码文件时,使用java命令,一定要给出字节码文件的扩展名 .class 。() 1-19如果一个Java程序中有多个类,编译后只生成一个字节码文件,其名字同主类名。() 1-20Java程序中出现的输出方法println( )和print ( ) 是完全一致的。() 1.B 2.D 3.C 4.C 5.A 1.错 2.对 3. 错 4. 对 5. 错 6. 对 7. 错 8. 对 9. 对 10.错 11. 对 12. 对 13. 错 14. 对 15.错 16. 对 17. 对 18.错 19. 错 20. 错

相关文档