资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
北京传智播客教育 www.itcast.cn,Java基础加强,方立勋,Eclipse的使用,工作空间(workspace)、工程(project) 在eclipse下Java程序的编写和运行,及java运行环境的配置。 快捷键的配置,常用快捷键: 内容提示:Alt + / 快速修复:Ctrl + 1 导包:Ctrl + shift + O 格式化代码块:ctrl + shift + F 向前向后:Alt + 方向键 添加注释 Ctrl+Shift+/ 除去注释 Ctrl+Shift+ 程序的调试和运行 F5(跳入) F6(跳过) F7(跳出),JDK 5.0 新特性,JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效、清晰,安全的代码。 静态导入 自动装箱/拆箱 增强for循环 可变参数 枚举 泛型 元数据,静态导入,JDK 1.5 增加的静态导入语法用于导入类的某个静态属性或方法。使用静态导入可以简化程序对类静态属性和方法的调用。 语法: Import static 包名.类名.静态属性|静态方法|* 例如: import static java.lang.System.out import static java.lang.Math.*,自动装箱/拆箱,JDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变量,这个过程称之为自动装箱。 自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量。 典型应用: List list = new ArrayList(); list.add(1); int j = (Integer)list.get(0);,增强for循环,引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦! 因此JDK5中定义了一种新的语法增强for循环,以简化此类操作。增强for循环只能用在数组、或实现Iterator接口的集合类上 语法格式: for(变量类型 变量 :需迭代的数组或集合) ,增强for循环,使用增强for循环的几个注意事项(以下程序的输出结果?),int arr = new int5; for(int num : arr) num = 1; System.out.println(arr0);,List list = new ArrayList(); list.add(“xxx“); for(String str : list) str = “yyy“; System.out.println(list.get(0);,可变参数,测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组,传数组又传参的情况。 注意:传入基本数据类型数组的问题。 从JDK 5开始, Java 允许为方法定义长度可变的参数。语法: public void foo(int args) 注意事项: 调用可变参数的方法时, 编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数 可变参数只能处于参数列表的最后, 所以一个方法最多只能有一个长度可变的参数,枚举类,为什么需要枚举? 一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。 JDK 5新增的 enum 关键字用于定义一个枚举类。,枚举类,枚举类具有如下特性: 枚举类也是一种特殊形式的Java类。 枚举类中声明的每一个枚举值代表枚举类的一个实例对象。 与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。 枚举类也可以实现接口、或继承抽象类。 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() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。,反射什么Class类,Class类用于表示.class文件,画图演示一个对象的创建过程。 如何得到某个class文件对应的class对象。 类名.class, 对象.getClass() Class.forName(“类名”) 以上三种方式,JVM都会把相应class文件装载到一个class对象中(只装载一次) 创建类的实例:Class.newInstance方法 数组类型的Class实例对象 Class.isArray() 总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int,void,反射,反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。 掌握反射技术的要点在于: 如何从一个class中反射出各个组成部分。 反射出来的对象怎么用。,Constructor类,Constructor类代表某个类中的一个构造方法 得到某个类所有的构造方法: 例子:Constructor constructors= Class.forName(“java.lang.String“).getConstructors(); 得到某一个构造方法: 例子: Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class); /获得方法时要用到类型 创建实例对象: 通常方式:String str = new String(new StringBuffer(“abc“); 反射方式: String str = (String)constructor.newInstance(new StringBuffer(“abc“); Class.newInstance()方法: 例子:String obj = (String)Class.forName(“java.lang.String“).newInstance(); 该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。,Field类,Field类代表某个类中的一个成员变量 问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,哪关联的是哪个对象呢?所以字段fieldX 代表的是x的定义,而不是具体的x变量。(注意访问权限的问题) 示例代码: ReflectPoint point = new ReflectPoint(1,7); Field y = Class.forName(“cn.itcast.corejava.ReflectPoint“).getField(“y“); System.out.println(y.get(point); /Field x = Class.forName(“cn.itcast.corejava.ReflectPoint“).getField(“x“); Field x = Class.forName(“cn.itcast.corejava.ReflectPoint“).getDeclaredField(“x“); x.setAccessible(true); System.out.println(x.get(point);,Method类,Method类代表某个类中的一个成员方法 得到类中的某一个方法: 例子: Method charAt = Class.forName(“java.lang.String“).getMethod(“charAt“, int.class); 调用方法: 通常方式:System.out.println(str.charAt(1); 反射方式: System.out.println(charAt.invoke(str, 1); 如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法! jdk1.4和jdk1.5的invoke方法的区别: Jdk1.5:public Object invoke(Object obj,Object. args) Jdk1.4:public Object invoke(Object obj,Object args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke(“str”, new Object1)形式。,用反射方式执行某个类中的main方法,目标: 写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。用普通方式调完后,大家要明白为什么要用反射方式去调啊? 问题: 启动Java程序的main方法的参数是一个字符串数组,即public static void main(String args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,new String“xxx”),javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。 解决办法: mainMethod.invoke(null,new Objectnew String“xxx“); mainMethod.invoke(null,(Object)new String“xxx“); ,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干个参数了,用反射技术实现一个简单的web服务器,内省(Introspector) JavaBean,什么是JavaBean和属性的读写方法? 访问JavaBean属性的两种方式: 直接调用bean的setXXX或getXXX方法。 通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式。 通过PropertyDescriptor类操作Bean的属性 通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。 什么情况下用内省?,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号