您的位置:首页 > 职场人生

黑马程序员:基础加强注解和泛型

2012-03-28 16:51 253 查看
---------------------- android培训java培训、期待与您交流! ----------------------了解注解及Java提供的几个基本注解:注解相当于一种标记,加了注解就等于打上了某种标记,没加则没有某种标记,打完标记以后javac编译器。开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事,标记可以加在,包,类,方法,字段,方法的参数以及局部变量上。为注解增加基本属性:什么是注解属性:一个注解就相当于一个胸牌,比如你贴了胸牌,那么证明你是学生,否则就不是,如果还想区分是那个班的学生,这时候可以为胸牌添加一个属性来区分。加了属性的效果为:@MyAnnotation(color="red");定义基本类型的属性和应用属性;在注解类中增加
String color();@@MyAnnotation(color="red");用反射的方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法:MyAnnotation a = (MyAnnotation)AnnotationnTest.class.getAnnotation(MyAnnotation.class);System.out.println(a.color());可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象。为属性指定缺省值;String color()
default "yellow";Value属性:String Value() default "zxx";如果注解中有一个名称为Value的属性,且你只想设置Value属性(即其属性都采用默认值或者你只有一个Value属性,那么可以省略value=部分: 如@MyAnnotation("lhm"));为注解增加高级属性:数组类型的属性:int[] arrayAttr defauil {1,2,3};@MyAnnotation(arrayAttr={2,3,4});如果数组属性中只有一个元素,这时属性值部分可以省略大括号。枚举类型的属性:EnumTest.TrafficLamp
lamp();@MyAnnotation(lamp=EnumTest.trafficLamp.GREEN)注解类型的属性:MetaAnnotation anntationAttr() default @MetaAnnotation("xxx");@MyAnnotation(annotationAttr=@MetaAnnotation("xyz"));可以认为上面这个@MyAnnotation是MyAnnotation类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:MetaAnnotation
ma = myAnnotation.annotationAttr();System.out.println(ma.Value());注解的详细语法可以通过看java语法规范了解,即看:java的languagespecification;枚举和注解都是特殊的类,不能用new创建它们的实例对象,创建枚举的实例对象就是在其中增加元素。在程序中创建一个注解的实例对象,就是直接@放上一个标记即可。体验泛型:JDK1.5以前的集合类中无法确定操作类型,而储存不同的元素时,编译器要强制类型转换且运行时出错。而JDK1.5的集合类希望你在定义集合时,明确表示你要想集合中装那种类型的数据,而无法加入指定类型意外的数据。泛型是提供给java编译器使用的,可以先定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去掉"类型"信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型类型完全一样,由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据,例如反射得到的集合,再调用add方法即可。泛型是JDK1.5的所有新特性中最难深入掌握的部分,不过,我们实际应用中不用掌握的那么深入,掌握泛型的一些基本的内容就差不多了,没有使用泛型时,只要是对象,不管是什么类型的对象,都可以储存进同一个集合中,使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能储存同一个类型的对象,这样更安全,并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。了解泛型:ArrayList类定义和ArrayList类引用中涉及如下术语:整个称为ArrayList泛型类型。ArrayList中的E称为类型变量或类型参数。整个ArrayList参数化的类型。ArrayList中的Integer称之为类型的参数的实例或实际类型参数。ArrayLisr<>中的<>念着typeof。ArrayList称之为原始类型。参数化类型和原始类型的兼容性:参数化类型可以引用一个原始类型的对象,编译报告警告:原始类型可以引用一个参数化类型的对象,编译也会报告警告。参数化类型不考虑类型参数的继承关系;Collectioncon
= new Collection 是不可以的。在创建数组实例时,数组的元素不能使用参数化的类型,例如: Vector vector ist[]= new Vector[10];泛型中的类型参数严格说明集合中装载的数据类型是什么和可以加入什么数据类型,记住:Collection 和Collection是两个没有转换关系的参数化的类型。泛型中的?通配符:使用?通配符引用其他参数化的类型,通配符定义的变量主要作用引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。定义泛型方法:Java的泛型方法没有C++模板函数功能强大,java无法和C++模板一样定义泛型。只有引用类型才能做为泛型的参数,基本数据类型不行。Java中的泛型类型(或者泛型)类似于C++中的模板,但是这种相似仅限于表面,Java语言中的泛型基本上完全是在编译器中实现,用于编译执行类型检查和类型推断,然后生成普通的非泛型的字节码,这种结束称之为擦除,(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)。这是因为扩展虚拟机指令集来支持泛型被认为是无法接受的,这会为Java厂商升级其JVM造成难以逾越的障碍,所以,java的泛型采用了可以完全在编译中实现的擦除方法。定义泛型类型:如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型时,这时就要采用泛型类型的方式进行定义,也就是类级别的泛型。类级别的泛型是根据引用该类名时指定的类型信息来参数化类型变量的。注意:在对泛型进行参数化时,类型参数的实例必须是引用类型,不能使基本类型。
当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类型),而不能被静态变量----------------------
android培训、java培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐