![[工学]Java新增讲义.doc_第1页](http://file.renrendoc.com/FileRoot1/2019-2/19/5a85a99d-1ede-4158-8f3d-785abd8830e0/5a85a99d-1ede-4158-8f3d-785abd8830e01.gif)
![[工学]Java新增讲义.doc_第2页](http://file.renrendoc.com/FileRoot1/2019-2/19/5a85a99d-1ede-4158-8f3d-785abd8830e0/5a85a99d-1ede-4158-8f3d-785abd8830e02.gif)
![[工学]Java新增讲义.doc_第3页](http://file.renrendoc.com/FileRoot1/2019-2/19/5a85a99d-1ede-4158-8f3d-785abd8830e0/5a85a99d-1ede-4158-8f3d-785abd8830e03.gif)
![[工学]Java新增讲义.doc_第4页](http://file.renrendoc.com/FileRoot1/2019-2/19/5a85a99d-1ede-4158-8f3d-785abd8830e0/5a85a99d-1ede-4158-8f3d-785abd8830e04.gif)
![[工学]Java新增讲义.doc_第5页](http://file.renrendoc.com/FileRoot1/2019-2/19/5a85a99d-1ede-4158-8f3d-785abd8830e0/5a85a99d-1ede-4158-8f3d-785abd8830e05.gif)
已阅读5页,还剩92页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
附录A JDK新增特性第一章 增强For循环1.1 For-Each形式从J2SE 5开始,定义了第二种for形式,即“for-each”风格的循环。for-each风格的循环用在一个对象集合中(如数组),以严格的连续方式,从开始到结束进行循环。与某些使用for-each关键词来实现for-each循环的语言(如C#)不同,Java是通过增强for语句来实现for-each功能。该方法的优势在于无需新的关键词,并且无需拆开先前的代码。for-each风格的for循环也称为增强的(enhanced)for循环。for-each版本的for循环的一般形式如下:for(type itr-var : collection)statement-block其中type指定了类型,itr-var指定了迭代变量(iteration variable)名,该变量将接收集合中的元素,方式是从集合的开始到结束一次一个。所要循环的集合由collection所指定。For可使用的集合类型很多,本章只使用了数组类型(后面将讨论for可使用的其他集合类型)。随着循环的迭代,会取出集合中的下一个元素并存储在itr-var中。该循环会一直重复下去,直到集合中的所有元素都已取出为止。由于迭代变量从集合中接收值,所以type必须与集合中存储的元素类型相同(或相互兼容)。为此,在数组上进行迭代时,type必须与数组的基本类型相兼容。要理解使用for-each循环的原因,请考虑一下for-each循环用于什么地方替换for循环类型。下面的程序片段是用传统的for循环来计算数组中各个值的总和:int nums = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;int sum = 0;for(int i=0; i 10; i+) sum += numsi;要计算总和,需要从头到尾按顺序读取nums中的每个元素。因此就要按严格的先后顺序读取整个数组,这通过指定nums数组的下标i(循环控制变量)来完成。另外还必须明确地指定循环控制变量的开始值和结束值及其增量。for-each风格循环中的for会使前述的循环自动化。它无需建立循环计数器、无需指定开始和结束值,并且无需手工地为数组指定下标。相反,它自动在整个数组中循环,从开始到结束来每次获得一个元素。例如,下面是用for-each版本的for重写前述程序片断后的程序:int nums = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;int sum = 0;for(int x: nums) sum += x;每次循环时,会给x自动赋予一个与nums中下一个元素相等的值。因此,在首次迭代时,x包含1;第二次迭代时,x包含2,等等。这样做不仅从语法上很流畅,而且还可避免出现越界错误。下面是演示上述for-each版本的for的完整程序。/Use a for-each style for loop.class ForEach public static void main(String args ) int nums = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; int sum = 0; /Use for-each style for to display and sum the values for(int x : nums) System.out.println(“Value is: “ + x);sum += x;System.out.println(“Summation: “+ sum);该程序的输出如下:Value is: 1Value is: 2Value is: 3Value is: 4Value is: 5Value is: 6Value is: 7Value is: 8Value is: 9Value is: 10Summation: 55可以看出,for-each风格中的for会自动按从最低下标到最高下标的顺序在数组中循环。虽然for-each风格的for会进行循环迭代直至检查完数组中的所有元素,但也可以使用break语句提前终止该循环。例如,下面程序仅计算nums的前5个元素的总和:/Use break with a for-each style for.class ForEach2 public static void main(String args int sum = 0;int nums = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;/use for to display and sum the valuesfor(int x : nums) System.out.println(“Value is: “ + x);sum +=x;if(x = 5) break; /stop the loop when 5 is obtainedSystem.out.println(“Summation of first 5 elements: “ + sum);下面是该程序的输出:Value is: 1Value is: 2Value is: 3Value is: 4Value is: 5Summation of first 5 elements: 15结果证实,for循环在获得第5个元素后停止。有关for-each风格的循环还要理解一个重点是:其迭代变量是“只读”的,因为它与数组的下标相关。对迭代变量赋值时,对数组下标是没有影响的。换句话说,为迭代变量赋一个新值是不会改变数组内容的。例如,考虑下面的程序:/ The for-each loop is essentially read-only.class NoChange public static void main(String args ) int nums = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;for(int x : nums) System.out.print(x + “ “);x = x * 10; / no effect on numsSystem.out.println( );for(int x : nums)System.out.print(x + “ “);System.out.println( ); 第一个for循环将迭代变量的值增加了10倍,但是该赋值对数组nums没有影响,就像第二个循环所显示的。下面显示的输出也证明了这一点:1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 101.2多维数组上的迭代这种for的增强版本也可用于多维数组。但是要记住,在Java中,多维数组包含数组的数组(例如,一个二维数组是一个一维数组的数组)。在多维数组上进行迭代时,理解这一点是很重要,因为每次迭代都要获取下一个数组,而不是单个的元素。另外,for循环中的迭代变量必须与所获取的数组类型保持兼容。例如,在二维数组的情况中,迭代变量必须是对一维数组的引用。通常,当使用for-each风格的for迭代N维数组时,所获取的对象是N-1维数组。为了理解这句话的含义,参见下面的程序。该程序使用嵌套的for循环按照行顺序,从先到后来获取二维数组的元素。/Use for-each style for on a two-dimensional array.class ForEach3 public static void main(String args ) int sum = 0;int nums = new int3 5;/give nums some valuesfor(int i = 0; i 3; i+)for(int j = 0; j; j+)numsi j = (i+1)*(j+1); /use for-each for to display and sum the valuesfor(int x : nums) for(int y : x) System.out.println(“Value is: “ + y); sum += y; System.out.printtn(“Summation: “ + sum);该程序的输出如下所示:Value is: 1Value is: 2Value is: 3Value is: 4Value is: 5Value is: 6Value is: 7Value is: 8Value is: 9Value is: 10Value is: 3Value is: 6Value is: 9Value is:12Value is: 15Summation:90在该程序中,特别要注意该行:for(int x : nums) 注意x是如何声明的:它是对一个一维整数数组的引用。这是必需的,因为for的每次迭代都要获取nums中的下一个数组(第一个获取的由nums0所指定),然后内部的for循环在这些数组中的每个元素间循环,并显示每个元素的值。1.3应用增强的For由于for-each风格的for只能在数组中从头到尾按顺序循环,所以有人可能认为它的用途有限,但情况并非如此,因为大量的算法需要的正是这种机制,最常见的一个就是搜索。例如,下面程序使用for循环来搜索排序的数值阵列,如果找到所需的数值,则停止循环。/Search an array using for-each style for.class Search public static void main(String args ) int nums = 6, 8, 3, 7, 5, 6, 1, 4;int val = 5;boolean found = false;/use for-each style for to search nums for valfor(int x : nums) if(x = val) found = true;break;if(found)System.out.println(“Value found!”);在该程序中,for-each风格的for是最佳的选择,因为搜索未排序的数组涉及到按顺序检查每个元素(当然,如果数组已排序,则可以使用二分法搜索,这就需要不同风格的循环了)。其他可以使用for-each风格的循环的应用程序包括计算平均值、查找一组数的最大值和最小值、查找重复值等等。在本章中我们使用数组作为示例,但for-each风格的for对于集合框架所定义的集合时特别有用。最为常见的是,for可在任意对象集合的元素中进行循环,只要该集合满足某些约束即可。第二章 变长参数2.1 Varargs:变长参数J2SE 5添加了一个新特性,简化了创建数目可变参数的方法。该特性被称为varargs,即变长参数(variable-length arguments)的简写。使用数目可变参数的方法称为variable-arity方法,或简称varargs方法。需要将数目可变参数传递给一个方法的情况很常见。例如,打开Internet连接的方法可能需要用户名、口令、文件名、协议等信息,如果某些信息未提供,它会使用默认值。在这种情况下,只传递默认值不适用的参数可能会更方便。另一个例子是新增的printf( )方法,它是Java的I/O类库的一部分,它接受一个数目可变参数,并将它们格式化之后输出。在J2SE 5之前,有两种方法处理变长参数,但这两种方法都不是很令人满意。如果参数的最大数目不大而且已知,则可以为该方法可能被调用的每一种方式创建其重载的版本。这样做可能适合于某些场合,但其适用范围比较狭窄。当参数的最大数目比较大而且不可知的时候,可使用第二种方法,即将这些参数置于一个数组中,然后将该数组传递给此方法。下面的程序演示了该方法:/Use an array to pass a variable number of/arguments to a method. This is the old-style/approach to variable-length arguments.class PassArray static void vaTest(int v ) System.out.print(“Number of args: “ + v.length + “ Contents: “); for(int x : v) System.out.print(x + “ “); System.out.println( );public static void main(String args )/Notice how an array must be created to/hold the n1 = 10;int n2 = 1, 2, 3 ;int n3 = ;vaTest(n1); / 1 argvaTest(n2); / 3 argvaTest(n3); / no arg该程序的输出结果如下:Number of args: 1 Contents: 10Number of args: 3 Contents: 1 2 3Number of args: 0 Contents: 在本程序中,方法vaTest( )通过数组v传递它的参数。这种方法确实使vaTest( )能够接受任意数目的参数,但它需要在调用vaTest( )之前手工将这些参数打包到一个数组中。每次调用vaTest( )的时候要建立一个数组不仅繁琐,而且容易出错。新的varargs特性提供了一个更简单、更好的选择。一个变长参数由三个句点()来指定。例如,下面是使用变长参数编写的vaTest( ):static void vaTest(int v)该语法告诉编译器调用的vaTest( )的参数数目可以是零或更多,结果是v被隐式声明为一个int类型的数组。因此,在vaTest( )内,是通过使用正常的数组句法来访问v。下面是使用变长参数改写的上一个程序:/ Demonstrate variable-length arguments.class VarArgs /vaTest( ) now use a vararg.static void vaTest(int v) System.out.print(“Number of args: “ + v.length +” Contents: “);for(int x : v)System.out.print(x + “ “);System.out.println( );public static void main(String args )/Notice how vaTest( )can be called with a/variable number of arguments.vaTest(10); / 1 argvaTest(1, 2, 3); / 1 argsvaTest( ); / no args该程序的输出与原版本的输出相同。此程序有两个重要的地方需要注意。首先,在vaTest( )内,v是作为一个数组被操作的,因为v本身就是一个数组。语法只是告诉编译器将使用可变数目的参数,且这些参数将存储到一个通过v引用的数组中。其次,在main( )内,调用的时候vaTest( )可带有不同数目的参数,甚至可以不带参数。这些参数自动地被置入一个数组并传递给v。在没有参数的情况下,数组的长度是零。一个方法既可以带“正常”参数,也可以带变长参数,但变长参数必须是该方法最后声明的参数。例如,下面的方法声明是完全可以接受的:int doIt(int a, int b,double c,intvals)在本例中,调用doIt( )时使用的前三个实参与前三个形参相匹配。接下去,系统认定剩余的实参属于vals。记住,varargs参数必须处于最后。例如,下面的声明是错误的:int doIt(int a,int b,double c,intvals,boolean stopFlag)/Error!因为这里在varargs参数后面声明一个常规参数。还有一点限制必须注意:只能有一个varargs参数。例如,下面的声明是无效的:int doIt(int a,int b,double c,intvals,doublemorevals/Error!试图声明第二个varargs参数是非法的。下面是vaTest( )的重写版本,它接受一个常规参数和一个变长参数:/Use varargs with standard arguments.class VarArgs2 /Here, msg is a normal parameter and v is a/varargs parameter.static void vaTest(String msg, int v) System.out.print(msg + v.length + “ Contents: “);for(int x : v)System.out.print(x + “ “);System.out.println( );public static void main(String args )vaTest(“One vararg: “, 10);vaTest(“Three vararg: “, 1, 2, 3);vaTest(“No vararg: “);该程序的输出如下所示:One vararg:1 Contents: 10Three vararg:3 Contents: 1 2 3No vararg:0 Contents:2.2重载Varargs方法可以重载一个接受变长参数的方法。例如,下面的程序对vaTest( )进行三次重载。/Varargs and overloading.class VarArgs3 static void vaTest(int v) System.out.print(“vaTest(int ): “ + “Number of args: “ + v.length + “ Contents: “); for(int x : v)System.out.print(x + “ “) ; System.out.println( );static void vaTest(Boolean v) System.out.print(“vaTest(Boolean ) “ + “Number of args: “ + v.length + “ Contents: “);for(Boolean x : v)System.out.print(x + “ “) ; System.out.println( );static void vaTest(String msg, int v) System.out.print(“vaTest(String, int ): “ + msg + v.length + “ Contents: “);for(int x : v) System.out.print(x + “ “);System.out.println( );public static void main(String args )vaTest(1, 2, 3);vaTest(“Testing:”, 10, 20);vaTest(true, false,false);该程序的输出如下所示:vaTest(int ); Number of args: 3 Contents: 1 2 3vaTest(String, int ): Testing: 2 Contents: 10 20vaTest(Boolean ) Number of args: 3 Contents: true false false本程序示范了重载varargs方法的两种方式。首先,其varargs参数的类型可以不同。如本例中的vaTest(int)和vaTest(Boolean)。记住,使得该参数被视为一个指定类型的数组。因此,正如可以使用不同数组参数类型来重载方法一样,可以使用不同varargs类型来重载varargs方法。在本例中,Java使用类型的差别来确定调用哪个重载方法。重载varargs方法的第二种方式是添加一个正常参数。vaTest(String,int)就是这样做的。在本例中,Java使用参数的数目和类型共同决定调用哪个方法。2.3 Varargs和模糊性重载一个接受变长参数的方法时,可能会出现某种意想不到的错误。这些错误涉及模糊性,可能会创建一个对已重载的Vararg方法的模糊调用。如下面的程序:/ Varargs, overloading, and ambiguity./This program contains an error and will/not compile!class VarArgs4 static void vaTest(int v) System.out.print(“vaTest(int ): “ + “Number of args: “ + v.length + “Contents: “);for(int x : v)System.out.print(x + “ “);Systrm.out.println( );static void vaTest(boolean v) System.out.print(“vaTest(boolean ) “ + “Number of args: “ + v.length + “Contents: “);for(Boolean x : v)System.out.print(x + “ “);Systrm.out.println( );public static void main(String args )vaTest(1,2,3 ); / OkvaTest(true, false,false); /OkvaTest( ); /Error: Ambiguous!在该程序中,对vaTest( )的重载是完全正确的。然而,该程序因为以下调用而无法编译:vaTest( );/Error:Ambiguous!因为varargs参数可以为空,所以该调用可以转换为对vaTest(int )和vaTest(boolean )的调用,二者同样有效,因此该调用在本质上具有模糊性。下面是另一个模糊性的示例。尽管以下这些vaTest( )的重载版本中有一个使用了正常参数,但其在本质上仍具有模糊性。static void vaTest(intv) /static void vaTest(int n,intv) /尽管vaTest( )的参数列表不同,但编译器无法解析以下调用:vaTest( 1)该调用会转换为带有一个varargs参数的对vaTest(int )的调用,还是不带varargs参数的对vaTest(int ,int )的调用?编译器无法回答此问题,因此这种情况是模糊的。由于上面所示的这些模糊错误,有时需要放弃重载,只能使用两个不同的方法名。另外,在某些情况下,模糊错误暴露了代码概念上的缺陷,这就需要你精心建构一个修补的解决方案了。第三章 枚举从Java的首个版本开始,许多程序员感觉缺少的一个特性就是枚举。枚举最简单的形式就是一个命名常量的列表。尽管Java提供了和它类似的其他特性,如final变量,但许多程序员依然怀念枚举在概念上的单纯性。在J2SE 5版中,Java程序员也可以使用枚举了。从简单的形式上看,Java的枚举似乎与其他语言中使用的枚举相似,然而,这只是一种表面现象。在C+等语言中,枚举只是一个命名整型常量的列表。在Java中,枚举定义为一个类类型。将枚举引进到类以后,枚举的概念被大大拓展。例如,在Java中,枚举可以有构造函数、方法和实例变量。因此,尽管Java对枚举的打造历时多年,但是其实现值得漫长的等待。3.1枚举的基础知识创建枚举类型需要使用新增的关键词enum。下面是一个简单的枚举,它列出了各种苹果品种:/An enumeration of apple varieties.enum Apple Johnthan, GoldenDel,RedDel,Winesap,CortlandJohnthan、GoldenDel这一类标识符称为枚举常量,它们全部被隐式声明为Apple的公有、静态成员,且类型就是声明的枚举类型,在本例中是Apple。在Java语言中,这些常量被称为“自类型化的”,“自”在此指一个封闭枚举。枚举一旦被定义,就可以创建该类型的变量。但尽管枚举能够定义类类型,却不能使用new实例化一个枚举。枚举变量的声明和使用方法类似于操作基本类型。例如,下面的代码声明ap是枚举类型Apple的一个变量:Apple ap;因为ap属于Apple类型,它只能被赋予给(或可包含)此枚举定义的值。例如,将值RedDel赋给ap:ap=Apple.RedDel;注意,RedDel是Apple先前定义的。两个枚举常量可使用关系运算符“=”来表示经过比较二者相等。例如,下列语句比较ap和GoldenDel常量。if(ap = =Apple.GoldenDel)/枚举值也可以用来控制switch语句,此时所以Case语句必须使用来自switch表达式所使用的同一个枚举类型的常量。例如,下列的switch语句就是有效的。/Use an enum to control a swith statement.switch(ap) case Jonathan:/case Winesap:/注意,在case语句中,使用枚举常量名称时没有用枚举类型名进行限定,也就是说使用的是Winesap,而不是Apple.Winesap。这是因为switch表达式中的枚举类型已经被隐式指定为case常量的枚举类型。因此不必再使用枚举类型名来限定case语句中的常量。而且这样做也会导致编译错误。显示一个枚举常量的时候,将输出它的名称。例如,有如下语句:System.out.println(Apple.Winesap);将显示名称Winesap。下面的程序完整地示范了Apple枚举类型的用法。/An enumeration of apple varieties.enum Apple Jonathan,GoldenDel,RedDel,Winesap,Cortlandclass EnumDemo public static void main(String args )Apple ap;ap = Apple.RedDel;/Output an enum value.System.out.println(“Value of ap:”+ap);System.out.println();ap = Apple.GoldenDel;/Compare two enum values.if(ap = Apple.GoldenDel)System.out.println(“ap contains GoldenDel.n”);/Use an enum to control a swith statement.switch(ap) case Jonathan:System.out.println(“Jonathan is red.”);break;case GoldenDel:System.out.println(“Golden Delicious is yellow.”);break;case RedDel:System.out.println(“Red Delicious is red.”);break;case Winesap:System.out.println(“Winesap is red.”);break;case Cortland:System.out.println(“Corland is red.”);break;程序的输出结果如下:Value of ap: RedDelap contains GoldenDel.Golden Delicious is yellow.3.2 values()和valueOf()方法所有枚举类型自动包括两个预定义方法:values()和valueOf()方法。它们的形式如下:public static enum-type values()public static enum-type valueOf(String str)values()方法返回包含一列枚举常量的数组。valueOf()方法返回其值与所传递的str中的字符串相对应的枚举常量。在两者情况下,enum-type都是枚举的类型。例如,在Apple枚举的例子中,Apple.valueOf(“Winesap”)的返回类型是Winesap。下列程序演示了values()和valueOf()方法:/Use the built-in enumeration methods./An enumeration of apple varieties.enum Apple Jonathan,GoldenDel,RedDel,Winesap,Cortlandclass EnumDemo2 public static void main(String args)Apple ap;System.out.println(“Here are all Apple constants:”);/use values()Apple allapples = Apple.values();for(Apple a : allapples)System.out.println(a);System.out.println();/use valueOf()ap = Apple.valueOf(“Winesap”);System.out.println(“ap contains”+ap);程序的输出结果如下:Here are all Apple constants:JonathanGoldenDelRedDelWinesapCortlandap contain Winesap请注意,本程序使用一个for-each类型的for循环来遍历调用values()方法得到的常量数组进行循环。为了示范的需要,创建了一个变量allapples并赋给它一个对此枚举数组的引用。这一步其实是不必要的,因为for循环可以按下述来重写,此时就不需要变量allapples了。for(Apple a:Apple.values()system.out.println(a);注意,看看对应于名称Winesap的值是如何通过调用valueOf()方法获得的。ap=Apple.valueOf(“Winesap”);正如解释的那样,valueOf()方法返回与字符串表示的常量名相关的枚举值。注意 C/C+程序员会发现,相对于其他语言来说,Java使枚举常量在人类可读的格式和二进制值之间的转换更加容易。这是Java在处理枚举上的一个重大进步。3.3 Java枚举是类类型Java的枚举是类类型,尽管不能使用new建立一个枚举,但它具有与其他类几乎相同的能力。由于枚举能够定义类,所以Java枚举在功能上比其他语言中不具有此种能力的枚举要强大得多:可以赋予它们构造函数,添加实例变量和方法,甚至实现接口。每一个枚举常量是它的枚举类型的一个对象,因此要为一个枚举定义构造函数,建立每个枚举常量时都要调用该构造函数。另外,对此枚举类型定义的任何实例变量,每一枚举常量都具有一个它们自己的副本。例如,请看Apple的下面这个版本:/Use an enum constructor, instance variable, and method.enum Apple Jonathan(10),GoldenDel(9),RedDel(12),Winesap(15),Cortland(8);private int price;/price of each apple/ConstructorApple(int p)price=p;int getPrice() return price;class EnumDemo3 public static void main(String args)Apple ap;/Display price of Winesap.System.out.println(“Winesap costs”+Apple.Winesap.getPrice()+“cent.n”);/Display all apples and prices:”);for(Apple a : Apple.values()System.out.println(a +”costs”+a.getPrice()+”cents.”);程序结果显示如下:Winesap costs 15 cents.All apple prices:Janathan costs 10 cents.GoldenDel costs 9 cents.RedDel costs 12 cents.Winesap costs 15 cents.Cortland costs 8 cents.该版本中的Apple增加了三个内容:第一个是实例变量price,表示各种苹果的价格;第二个是Apple构造函数,传递苹果的价格;第三个是方法getPrice(),返回苹果的价格。在main()中声明了变量ap后,会为每个指定的常量调用一次Apple构造函数。注意观察构造函数的参数是如何指定的:它们放在每个常量后的括号内。如下所示:Jonathan(10),GoldenDel(9),RedDel(12),Winesap(15),Cortland(8);这些值被传给Apple()的参数p,再由参数p将值赋给price。同样,构造函数针对每个常量被调用一次。由于每个枚举常量都有它自己的price副本,所以可以通过调用getPrice()获得一个种类苹果的价格。例如,在main()中,Winesap的价格可通过下列语句来获得:Apple.Winesap.getPrice()在枚举中执行一个for循环可以获得全部种类的价格。由于每个枚举常量都具有price的副本,因此与各常量相关联的值是分开而且是不同的。这是一个强大的功能,只有像Java一样将枚举作为类实现的时候才能实现。在前一个例子只包括一个构造函数,但实际上枚举能够提供两个或更多重载的形式。例如,下面的Apple提供了一个默认构造函数,用于将价格初始化为-1,表示没有价格数据可用。/Use an enum constructor.enum Apple Jonathan(10),GoldenDel(9),RedDel,Winesap(15),Cortland(8);private int price;/price of each apple/ConstructorApple(int p) price = p;/Overloaded constructorApple() price = -1;int getPrice() return price;注意在该版本中,RedDel没有给定参数,这意味着调用了默认的构造函数,将RedDel的price变量设定为-1。枚举有两个限制:首先,枚举不能继承另一个类;其次,枚举不能是超类,这意味着枚举不能被扩展。枚举在其他方面大体与其他类型的类相同。需要记住的是,每个枚举常量都是定义它的类的一个对象。3.4枚举继承Enum尽管不能在声明枚举时继承超类,但是所有枚举会自动继承一个类:java.lang.Enum。此类定义了所有枚举都可以使用的几个方法。Enum类将在后面详述,这里先讨论它的三个方法。若要得到一个表示枚举常量在常量列表中的位置的值(该值称为顺序值),可调用ordinal()方法来检索它,形式如下所示:final int ordinal()它返回调用常量的顺序值。顺序值从0开始,因此在枚举Apple中,Jonathan的顺序值是0,GoldenDel的顺序值是1,RedDel的顺序值是2,依此类推。可以使用compareTo()方法比较同一个枚举中的两个常量的顺序值,一般形式如下:final int compareTo(enum-type e)这里的enum-type是枚举的类型,e是将要与调用的常量进行比较的常量(记住,调用枚举类型常量和e必须属于同一个枚举)。如果调用常量的顺序比e的小,则compareTo()返回一个负值;如果两个顺序值相同,则返回0;如果调用常量的顺序值比e的大,则compareTo()返回一个正值。可以使用equals()方法比较一个枚举常量同其他对象是否相等,该方法重写了Object定义的equals()。要注意,尽管equals()可以比较一个枚举常量和任何其他对象,但是只有当这两个对象属于同一个枚举类型且均指同一个常量时,二者才会相等。如果这两个常量来自不同的枚举,仅仅具有相同的顺序值并不会让equals()返回true。记住,比较两个枚举引用是否相等时可使用“=”符号。下面的程序演示了ordinal()、compareTo()和equals()方法:/Demonstrate ordinal( ),compareTo( ),and equals( )./An enumeration of apple varieties.enum Apple Jonathan,GoldenDel,RedDel,Winesap,Cortlandclass EnumDemo4 public static void main(String args )Apple ap,ap2,ap3;/Obtain all ordinal values using ordinal( ).System.out.println(“Here are all apple constants” +“and their ordinal values:”);for(Apple a : Apple.values( )System.out.println(a + “ “ +a.ordinal( );ap=Apple.RedDel;ap2=Apple.GoldenDel;ap3=Apple.RedDel;System.out.println( );/Demonstrate compareTo( )and equals( )if(pareTo(ap2)0)System.out.println(ap2+”comes before “+ap);if(pareTo(ap3)=0)System.out.println(ap+”equals”+ap3);System.out.println( );if(ap.equals(ap2)System.out.println(“Error!”);if(ap.equals(ap3)System.out.println(ap + “ equals ” +ap3);if(ap = ap3)System.out.println(ap +” =” +ap3);输出结果显示如下:Here are all apple constant
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025秋统编版(2024)新教材三年级语文上册第七单元《语文园地七》练习题及答案
- 特种玻璃电子束切割超硬涂层工艺考核试卷及答案
- 印染烘干操作工综合考核试卷及答案
- 电机铁芯叠装工异常处理考核试卷及答案
- 印后成型工数字化技能考核试卷及答案
- 信息技术考试ps试题及答案
- 有限空间作业及企业安全管理风险管控与隐患治理试卷
- 银行综合试题及答案
- 银行债务员面试题目及答案
- 银行押运员面试题及答案
- 俄乌局势进展
- 短视频个人劳务合同范本
- 纯电动汽车维护与保养 课件 模块一新能源汽车维护与保养基础认知
- 翻译后的基因表达调控
- 2025年度中国工商银行河南省分行社会招聘120人备考练习试题及答案解析
- 2025甘肃兰州兴蓉环境发展有限责任公司招聘内控管理岗等岗位5人笔试模拟试题及答案解析
- (2025年标准)酒店政府采购协议书
- 重庆中医药学院2025年第二季度考核招聘工作人员笔试备考题库带答案详解
- 用电安全与消防知识培训课件
- 2025年法考真题及答案
- 中医优才考试试题及答案
评论
0/150
提交评论