java5新特性.docx
- 文档编号:15033054
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:15
- 大小:19.43KB
java5新特性.docx
《java5新特性.docx》由会员分享,可在线阅读,更多相关《java5新特性.docx(15页珍藏版)》请在冰点文库上搜索。
java5新特性
1 泛型(Generic)
1.1 说明
增强了java的类型安全,可以在编译期间对容器内的对象进行类型检查,在运行期不必进行类型的转换。
而在j2se5之前必须在运行期动态进行容器内对象的检查及转换
减少含糊的容器,可以定义什么类型的数据放入容器
ArrayList
IntegerintegerObject;
listOfIntegers=newArrayList
listOfIntegers.add(newInteger(10));// 只能是Integer类型
integerObject=listOfIntegers.get(0);// 取出对象不需要转换
1.2 用法
声明及实例化泛型类:
HashMap
//不能使用原始类型
GenList
J2SE5.0目前不支持原始类型作为类型参数(typeparameter)
定义泛型接口:
publicinterfaceGenInterface
voidfunc(Tt);
}
定义泛型类:
publicclassArrayList
publicclassGenMap
例1:
publicclassMyList
{
publicvoidswap(inti,intj)
{
Elementtemp=this.get(i);
this.set(i,this.get(j));
this.set(j,temp);
}
publicstaticvoidmain(String[]args)
{
MyList
list.add("hi");
list.add("andy");
System.out.println(list.get(0)+""+list.get
(1));
list.swap(0,1);
System.out.println(list.get(0)+""+list.get
(1));
}
}
例2:
publicclassGenList
privateT[]elements;
privateintsize=0;
privateintlength=0;
publicGenList(intsize){
elements=(T[])newObject[size];
this.size=size;
}
publicTget(inti){
if(i returnelements[i]; } returnnull; } publicvoidadd(Te){ if(length elements[length++]=e; } } 泛型方法: publicclassTestGenerics{ public returnobj.toString(); } publicstaticvoidmain(String[]args){ TestGenericst=newTestGenerics(); Strings="Hello"; Integeri=100; System.out.println(t.getString(s)); System.out.println(t.getString(i)); } } 1.3 受限泛型 受限泛型是指类型参数的取值范围是受到限制的.extends关键字不仅仅可以用来声明类的继承关系, 也可以用来声明类型参数(typeparameter)的受限关系.例如,我们只需要一个存放数字的列表, 包括整数(Long,Integer,Short), 实数(Double,Float), 不能用来存放其他类型, 例如字符串(String), 也就是说, 要把类型参数T的取值泛型限制在Number极其子类中.在这种情况下, 我们就可以使用extends关键字把类型参数(typeparameter)限制为数字 示例 publicclassLimited publicstaticvoidmain(String[]args){ Limited Limited } } 1.4 泛型与异常 类型参数在catch块中不允许出现,但是能用在方法的throws之后。 例: importjava.io.*; interfaceExecutor voidexecute()throwsE; } publicclassGenericExceptionTest{ publicstaticvoidmain(Stringargs[]){ try{ Executor publicvoidexecute()throwsIOException{ //codeherethatmaythrowan //IOExceptionorasubtypeof //IOException } }; e.execute(); }catch(IOExceptionioe){ System.out.println("IOException: "+ioe); ioe.printStackTrace(); } } } 1.5 泛型的通配符"? " "? "可以用来代替任何类型, 例如使用通配符来实现print方法。 publicstaticvoidprint(GenList >list){}) 1.6 泛型的一些局限型 不能实例化泛型 Tt=newT();//error 不能实例化泛型类型的数组 T[]ts=newT[10]; //编译错误 不能实例化泛型参数数 Pair 类的静态变量不能声明为类型参数类型 publicclassGenClass privatestaticTt; //编译错误 } 泛型类不能继承自Throwable以及其子类 publicGenExpection 不能用于基础类型int等 Pair Pair 2 增强循环(EnhancedforLoop) 旧的循环 LinkedListlist=newLinkedList(); list.add("Hi"); list.add("everyone! "); list.add("Was"); list.add("the"); list.add("pizza"); list.add("good? "); for(inti=0;i System.out.println((String)list.get(i)); //或者用以下循环 //for(Iteratoriter=list.iterator();iter.hasNext();){ //IntegerstringObject=(String)iter.next(); //...morestatementstousestringObject... //} 新的循环 LinkedList list.add("Hi"); list.add("everyone! "); list.add("Was"); list.add("the"); list.add("pizza"); list.add("good? "); for(Strings: list) System.out.println(s); 很清晰、方便,一看便知其用法 3 可变参数(VariableArguments) 实现了更灵活的方法参数传入方式,System.out.printf是个很好的例子 用法: voidtest(Object…args) 一个很容易理解的例子 publicstaticintadd(int...args){ inttotal=0; for(inti=0;i total+=args[i]; returntotal; } publicstaticvoidmain(String[]args){ inta; a=Varargs.add(1,2,3,4,5,6,7,8,9,10); System.out.println(a); } 4 自动实现装箱和解箱操作(Boxing/UnboxingConversions) 说明: 实现了基本类型与外覆类之间的隐式转换。 基本类型至外覆类的转换称为装箱,外覆类至基本类型的转换为解箱。 这些类包括 PrimitiveType ReferenceType boolean Boolean byte Byte char Character short Short int Integer long Long float Float double Double 例如,旧的实现方式 IntegerintObject; intintPrimitive; ArrayListarrayList=newArrayList(); intPrimitive=11; intObject=newInteger(intPrimitive); arrayList.put(intObject);// 不能放入int类型,只能使Integer 新的实现方式 intintPrimitive; ArrayListarrayList=newArrayList(); intPrimitive=11; //在这里intPrimitive被自动的转换为Integer类型 arrayList.put(intPrimitive); 5 静态导入(StaticImports) 很简单的东西,看一个例子: 没有静态导入 Math.sqrt(Math.pow(x,2)+Math.pow(y,2)); 有了静态导入 importstatic java.lang.Math.*; sqrt(pow(x,2)+pow(y,2)); 其中importstatic java.lang.Math.*;就是静态导入的语法,它的意思是导入Math类中的所有static方法和属性。 这样我们在使用这些方法和属性时就不必写类名。 需要注意的是默认包无法用静态导入,另外如果导入的类中有重复的方法和属性则需要写出类名,否则编译时无法通过。 6 枚举类(EnumerationClasses) 用法: publicenumName{types,….} 简单的例子: publicenumColors{Red,Yellow,Blue,Orange,Green,Purple,Brown,Black} publicstaticvoidmain(String[]args){ ColorsmyColor=Colors.Red; System.out.println(myColor); } 又一个简单例子: importjava.util.*; enumOperatingSystems{windows,unix,linux,macintosh} publicclassEnumExample1{ publicstaticvoidmain(Stringargs[]) { OperatingSystemsos; os=OperatingSystems.windows; switch(os){ casewindows: System.out.println(“YouchoseWindows! ”); break; caseunix: System.out.println(“YouchoseUnix! ”); break; caselinux: System.out.println(“YouchoseLinux! ”); break; casemacintosh: System.out.println(“YouchoseMacintosh! ”); break; default: System.out.println(“Idon’tknowyourOS.”); break; } } } 应运enum简写的例子: importjava.util.*; publicclassEnumTest { publicstaticvoidmain(String[]args) { Scannerin=newScanner(System.in); System.out.print("Enterasize: (SMALL,MEDIUM,LARGE,EXTRA_LARGE)"); Stringinput=in.next().toUpperCase(); Sizesize=Enum.valueOf(Size.class,input); System.out.println("size="+size); System.out.println("abbreviation="+size.getAbbreviation()); if(size==Size.EXTRA_LARGE) System.out.println("Goodjob--youpaidattentiontothe_."); } } enumSize { SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL"); privateSize(Stringabbreviation){this.abbreviation=abbreviation;} publicStringgetAbbreviation(){returnabbreviation;} privateStringabbreviation; } enum类中拥有方法的一个例子: enumProgramFlags{ showErrors(0x01), includeFileOutput(0x02), useAlternateProcessor(0x04); privateintbit; ProgramFlags(intbitNumber) { bit=bitNumber; } publicintgetBitNumber() { return(bit); } } publicclassEnumBitmapExample{ publicstaticvoidmain(Stringargs[]) { ProgramFlagsflag=ProgramFlags.showErrors; System.out.println(“Flagselectedis: “+ flag.ordinal()+ “whichis“+ flag.name()); } } 7 元数据(Metadata) 请参考 8 BuildingStrings(StringBuilder类) 在JDK5.0中引入了StringBuilder类,该类的方法不是同步(synchronized)的,这使得它比StringBuffer更加轻量级和有效。 9 控制台输入(ConsoleInput) 在JDK5.0之前我们只能通过JOptionPane.showInputDialog进行输入,但在5.0中我们可以通过类Scanner在控制台进行输入操作 例如在1.4中的输入 Stringinput=JOptionPane.showInputDialog(prompt); intn=Integer.parseInt(input); doublex=Double.parseDouble(input); s=input; 在5.0中我们可以 Scannerin=newScanner(System.in); System.out.print(prompt); intn=in.nextInt(); doublex=in.nextDouble(); Strings=in.nextLine(); 10 CovariantReturnTypes(不晓得怎么翻译,大概是改变返回类型) JDK5之前我们覆盖一个方法时我们无法改变被方法的返回类型,但在JDK5中我们可以改变它 例如1.4中我们只能 publicObjectclone(){...} ... Employeecloned=(Employee)e.clone(); 但是在5.0中我们可以改变返回类型为Employee publicEmployeeclone(){...} ... Employeecloned=e.clone(); 11 格式化I/O(FormattedI/O) 增加了类似C的格式化输入输出,简单的例子: publicclassTestFormat{ publicstaticvoidmain(String[]args){ inta=150000,b=10; floatc=5.0101f,d=3.14f; System.out.printf("%4d%4d%n",a,b); System.out.printf("%x%x%n",a,b); System.out.printf("%3.2f%1.1f%n",c,d); System.out.printf("%1.3e%1.3e%n",c,d*100); } } 输出结果为: 150000 10 249f0a 5.013.1 5.010e+003.140e+02 下面是一些格式化参数说明(摘自CoreJava2VolumeI-Fundamentals,SeventhEdition) Table3-5.Conversionsforprintf ConversionCharacter Type Example d Decimalinteger 159 x Hexadecimalinteger 9f o Octalinteger 237 f Fixed-pointfloating-point 15.9 e Exponentialfloating-point 1.59E+01 g Generalfloating-point(theshorterof e andf) a Hexadecimalfloatingpoint 0x1.fccdp3 s String Hello c Character H b Boolean TRUE h Hashcode 42628b2 tx Dateandtime SeeTable3-7 % Thepercentsymbol % n Theplatform-dependentlineseparator Table3-7.DateandTimeConversionCharacters ConversionCharacter Type Example C Completedateandtime MonFeb0918: 05: 19PST2004 F ISO8601date 2004-02-09 D U.S. formatteddate(month/day/year) 02/09/2004 T 24-hourtime
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java5 特性
![提示](https://static.bingdoc.com/images/bang_tan.gif)