![补充2-内部类、枚举、泛型、反射_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-6/3/534cca07-c773-40fd-abca-12f7571a23f4/534cca07-c773-40fd-abca-12f7571a23f41.gif)
![补充2-内部类、枚举、泛型、反射_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-6/3/534cca07-c773-40fd-abca-12f7571a23f4/534cca07-c773-40fd-abca-12f7571a23f42.gif)
![补充2-内部类、枚举、泛型、反射_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-6/3/534cca07-c773-40fd-abca-12f7571a23f4/534cca07-c773-40fd-abca-12f7571a23f43.gif)
![补充2-内部类、枚举、泛型、反射_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-6/3/534cca07-c773-40fd-abca-12f7571a23f4/534cca07-c773-40fd-abca-12f7571a23f44.gif)
![补充2-内部类、枚举、泛型、反射_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-6/3/534cca07-c773-40fd-abca-12f7571a23f4/534cca07-c773-40fd-abca-12f7571a23f45.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、内部类内部类(嵌套类)内部类(嵌套类)内部类就是定义在另一个类内部的类。内部类对于同一包中的其它类来说,内部类能够隐藏起来。注意注意内部类可以访问其外部类中所有的属性和方法无需创建外部类的对象,即可从内部类访问外部类的变量和方法。必须创建内部类的对象,否则无法从外部类访问内部类的变量和方法。如果内部类中有和外部类同名的变量或方法,则内部类的变量和方法将获得比外部类的变量和方法更高的优先级。不能定义static变量内部类类中定义的内部类类中定义的内部类public class Outer private int varOuter=100; class Inner int varInner=200
2、; public void showOuter() System.out.println(varOuter); /是否能够输出? public void showInner() Inner i=new Inner(); System.out.println(i.varInner); 内部类类中定义的内部类类中定义的内部类普通类的访问权限修饰符defaultpublic内部类的访问权限修饰符defaultpublic protectedprivate内部类内部类的访问内部类的访问在Outer内访问Inner,只需如下:在Outer外访问Inner,必须如下: Inner in = new Inn
3、er() ; Outer o = new Outer(); /实例化外部类 Outer.Inner oi = o.new Inner(); /实例化内部类静态内部类用static标识的内部类为静态内部类。静态内部类作为外部类的静态成员,不能访问外部类非静态成员。非静态内部类只能定义非静态成员,而静态内部类可以定义静态成员和非静态成员。使用Outer.Inner inn=new Outer.Inner()方式实例化静态内部类。非静态内部类不可以使用上面的方式实例化。示例:OuterStatic.java局部内部类局部内部类局部内部类在一个类的方法体中或程序块内定义的内部类class A int
4、a; public void method() class B class A int a; public void method( int c ) int b=0; class B 类中定义的类中定义的内部类内部类局部内部类局部内部类局部内部类局部内部类局部内部类示例示例在方法定义 的内部类中 只能访问方法 中的final类型 的局部变量public class Outer2 public int a = 1; private int b = 2; public void method( final int c) int d = 3; final int e = 2; class Inner
5、 private void iMethod( int e) /System.out.println(e); 静态导入JDK 5.0JDK 5.0后后 增加的静态导入语法用于导入指定增加的静态导入语法用于导入指定类的某个静态属性值类的某个静态属性值( (方法方法) )或全部静态属性值或全部静态属性值( (方法方法) )静态导入语句使用 import staticimport static 语句导入指定类的单个静态属性: import static java.lang.System.out导入指定类全部静态属性方法 import static java.lang.Math.*增强for循环引入增强
6、for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦!因此JDK5中定义了一种新的语法增强for循环,以简化此类操作。增强for循环只能用在数组数组、或实现实现IteratorIterator接口接口的集合类上语法格式: for(变量类型 变量:需迭代的数组或集合)可变参数从JDK 5开始, Java 允许为方法定义长度可变的参数。语法:public void foo(int args)注意事项:调用可变参数的方法时, 编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数可变参数只能处于参数
7、列表的最后, 所以一个方法最多只能有一个长度可变的参数测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组情况。注意:传入基本数据类型数组的问题(不会拆分的)。枚举类为什么需要枚举?一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。案例: Personname,sex引出问题-传统解决方法1、2JDK 5新增的 enum 关键字用于定义一个枚举类。使用enmu来解决上述问题枚举类小练习-带作枚举类小练习:设计一个Student类class Studen
8、tprivate String name;private Grade grade;.要求学生的grade只能是a,b,c,d,e 五个级别.a表示(优秀)b表示(良好) c表示(一般) d表示(及格) e表示(不及格)可以给学生设置成绩,并可以输出学生成绩情况(是优秀还是良好.)枚举类小结枚举类具有如下特性:使用内部类给每个枚举实例编写函数print。枚举类也是一种特殊形式的Java类。枚举类中声明的每一个枚举值代表枚举类的一个实例对象。与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。枚举类也可以实现接口、或继承抽象类。
9、JDK5中扩展了swith语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型。若枚举类只有一个枚举值,则可以当作单态设计模式使用。练习学生完成练习学生完成:请编写一个关于星期几的枚举WeekDay,要求:枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 该枚举要有一个方法,调用该方法返回中文格式的星期。枚举类Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:name()ordinal()valueof(Class enumClass, String name)values() 每个枚举
10、类都具有该方法,它遍历枚举类的所有枚举值非常方便。通过反射查看类的信息每个类被加载后类被加载后, 系统都会为该类生成一个对应的 Class 对象, 通过该 Class 对象就可以访问到 JVM 中的这个类Java 程序中获得 Class 对象通常有如下三种方式:使用 Class 的 forName() 调用某个类的调用某个类的 class class 属性属性调用某个对象的 getClass()一旦获取了某个类的 Class 对象之后, 程序就可以调用 Class 对象的方法来获得该对象和该类的真实信息了使用反射生成对象通过反射来生成对象有如下两种方式:使用 Class 对象的 newInst
11、ance() 方法来创建 Class 对象对应类的实例, 这种方式要求该这种方式要求该 Class Class 对象的对应类有默认的构造器对象的对应类有默认的构造器, 而执行 newInstance() 方法时实际上是利用默认的构造器来创建该类的实例先使用 Class 对象获取指定的 Constructor 对象, 再调用 Constructor 对象的 newInstance() 方法来创建该 Class 对象对应类的实例. 通过这种方式可以选择使用某个类的指定的构造器来创建实例使用反射调用方法当获取某个类对应的 Class 对象后, 就可以通过 Class 对象的 getMethods()
12、 或 getMethod() 方法来获取全部方法或指定的方法.每个 Method 对象对应一个方法, 获得 Method 对象后, 程序就可通过该 Method 来调用对应方法. 在 Mthod 里包含一个 invoke() 方法使用反射访问属性值通过 Class 对象的 getFields() 或 getField() 方法可以获取该类所包括的全部 Field 或指定的 Field Filed 通过如下两组方法来访问属性get(Object obj) 字段类型是引用类型,用此法getXXX(Object obj) 字段类型是基本数据类型,用此法setXXX(Object obj, Xxx v
13、al);反射的一个小练习已经知道一个文件内容如下:String classPath=“com.Dog;String method=“cry;String parameter=“name;String parameterType=java.lang.String;String parameterVal=“小狗狗;请使用反射机制来调用该函数.内省(Introspector) JavaBeanjavabean是用来干什么的?什么是JavaBean和属性的读写方法?访问JavaBean属性的两种方式:直接调用bean的setXXX或getXXX方法。通过内省技术访问(java.beans包提供了内省的
14、API),内省技术访问也提供了两种方式。通过PropertyDescriptor类操作Bean的属性通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。泛型(Generic)泛形的作用JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题。例如:ArrayList list = new ArrayList(
15、);list.add(abc);Integer num = (Integer) list.get(0); /运行时会出错,但编码时发现不了list.add(new Random();list.add(new ArrayList();for(int i=0;ilist.size();i+)(?)list.get(i); /此处取出来的对象应转换成什么类型泛型(Generic) 泛形的作用JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。注意:泛型是提供给javac编译器
16、使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。泛形的基本术语,以ArrayList为例:念着typeofArrayList中的E称为类型参数变量ArrayList中的Integer称为实际类型参数整个称为ArrayList泛型类型整个ArrayList称为参数化的类型ParameterizedType 泛型典型应用使用迭代器迭代泛形集合中的元素。比如List 放字串使用增强for循环迭代泛形集合中的元素。比如List 放
17、字串存取HashMap中的元素。比如map.put(“1”,”abc”)使用泛形时的几个常见问题:使用泛形时,泛形类型须为引用类型,不能是基本数据类型如果两边都用泛型,则类型必须一致如果只有一边使用泛型,另外一边不使用泛型,亦可.ArrayList list = new ArrayList();ArrayList list = new ArrayList(); ArrayList list = new ArrayList ();ArrayList list = new ArrayList();自定义泛形泛型方法Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对
18、泛形进行声明,语法: ,T可以是任意字母,但通常必须要大写。通常需放在方法的返回值声明之前。例如:public void test(T t,E e)public static void doxx(T t);练习:编写一个泛形方法,实现数组元素的交换。编写一个泛形方法,接收一个任意数组,并颠倒数组中的所有元素。注意:只有对象类型才能作为泛型方法的实际参数。在泛型中可以同时有多个类型,例如:public static V getValue(K key) return map.get(key);自定义泛形泛型方法在类名后也可以声明泛型,这样在非静态函数中,就可以直接使用,而不需再次声明.比如: pu
19、blic class Cat注意,类名后声明的泛型,在静态函数中是不能直接使用的,仍然需要自己声明,注意T的位置在static后.public static void doxx(T t);自定义泛形泛型类和反射泛形如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:public class GenericDao private T field1;public void save(T obj)public T getId(int id)注意,静态方法不能使用类定义的泛形,而应单独定义泛形。泛形的典型应用:BaseDao和反射泛型泛型的高级应用通配符定义一个
20、方法,接收一个集合,并打印出集合中的所有元素,如下所示: void print (Collection c) for (String e : c) System.out.println(e); 问题:该方法只能打印保存了Object对象的集合,不能打印其它集合。通配符用于解决此类问题,方法的定义可改写为如下形式: void print (Collection c) /Collection(发音为:collection of unknown) for (Object e : c) System.out.println(e);此种形式下需要注意的是:由于print方法c参数的类型为Collection,即
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 英语-河南金太阳2024-2025学年高二上学期第二次月考
- 加强学校实验室的安全教育
- 2025年高性能覆铜箔板原纸项目建议书
- 项目落地执行综合解决方案手册
- 大学生夏季安全教育
- 影视行业拍摄安全须知
- 格林童话中的教育意义与价值分析
- 课本里的历史人物读后感
- 景观仿木护栏安装施工方案
- 山东畜牧养殖温室施工方案
- 2024年09月2024渤海银行天津滨海新区分行校园招聘笔试历年参考题库附带答案详解
- 2024低血糖的急救诊断和治疗
- 期末考试成绩分析报告课件
- 儿童哮喘的防治与治疗
- 新时代中国特色社会主义理论与实践2024版研究生教材课件全集6章
- 学校安全教师培训
- 《由宋城集团的成功》课件
- (2024)湖北省公务员考试《行测》真题及答案解析
- 信息经济学 课件(1至6章)
- 金融警示教育案例
- 中小学校食品安全与膳食经费管理工作指引
评论
0/150
提交评论