Java核心逻辑第12章JDK新特性.ppt

上传人:本田雅阁 文档编号:2201816 上传时间:2019-03-03 格式:PPT 页数:41 大小:539.51KB
返回 下载 相关 举报
Java核心逻辑第12章JDK新特性.ppt_第1页
第1页 / 共41页
Java核心逻辑第12章JDK新特性.ppt_第2页
第2页 / 共41页
Java核心逻辑第12章JDK新特性.ppt_第3页
第3页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Java核心逻辑第12章JDK新特性.ppt》由会员分享,可在线阅读,更多相关《Java核心逻辑第12章JDK新特性.ppt(41页珍藏版)》请在三一文库上搜索。

1、第12章 JDK新特性,回顾,class对象 获取类对象的方式 反射包(java.lang.reflect) 反射的作用,本章目标,静态导入 可变长参数 格式化输入输出 枚举 注解 JDK6/JDK7新特性,本章结构,JDK新特性,JDK6新特性,JDK7新特性,二进制字面值,脚本支持,JDK5新特性,访问javac的api,可变长参数,格式化输入/输出,枚举,注解,静态导入,静态导入,通过静态导入可以在使用一个类型静态成员的时候,不 用书写类名,直接使用静态成员即可 以前统一声明常量时,很多人选择在一个接口中声明许多静态常量,接口的用途是约定实现类有什么功能,用来声明常量显然不合理,现在可以

2、统一在一个类中声明静态常量,并且在需要的地方使用静态导入 注意:静态导入会降低程序的可读性,不要过多使用!,System.out.println(Math.PI); System.out.println(Math.abs(-1);,静态导入,import static java.lang.Math.*; import static java.lang.System.*; public class TestStatic public static void main(String args) System.out.println(PI); System.out.println(abs(-1);

3、out.println(PI); ,可变长参数,可以使方法的参数个数可变,public static void print(String s) System.out.println(s); public static void main(String args) print(); print(“tom“); print(“tom“,“cat“); public static void print(String. s) for (String string : s) System.out.println(string); ,可变长参数,可变长参数其本质实际上就是数组,但比定义数组更加灵 活,pu

4、blic static void print1(String s) public static void print(String. s) for (String ss : s) System.out.println(ss); ,可变长参数,可以把main函数改写成可变长参数 一个方法中最多有一个可变长参数 可变长参数必须作为方法的最后一个参数,public static void main(String. args) print(); print(“tom“); print(“tom“, “cat“); ,格式化的输入输出,JDK5.0提供了新的输入输出语句 格式化输出语句 System.o

5、ut.printf() String的静态方法:static String format(String format, Object. args)可以用来生成一个字符串,这个方法的用法和printf一模一样,printf显然在程序中毫无用途,String.format方法才是非常实用的,尤其在拼装字符串时,String name = “张三“; int age = 20; System.out.printf(“有个学生叫%s,他的年龄是%d。n“, name, age); / 创建格式化字符串 String msg = String.format(“有个学生叫%s,他的年龄是%d。“, nam

6、e, age); System.out.println(msg);,格式化的输入输出,提供了更为简单的从命令行获取输入的工具类 java.util.Scanner 不要关闭Scanner,如关闭了,则System.in也关闭了 当调用nextInt()等方法时如果抛出异常(InputMismatchException),则这个Scanner对象不可以再继续使用,必须重新创建一个。,Scanner input = new Scanner(System.in); int i = input.nextInt();,枚举类型,一个类所创建的对象个数是固定的 枚举本质上还是类 enum关键字,enum

7、Season SPRING, SUMMER, AUTUMN, WINTER ,public class TestEnum public static void main(String args) Season season = Season.SPRING; ,枚举类型,在没有枚举类型前 ,可以通过如下代码模拟枚举类型,public class TestSeason public static void main(String args) Season season = Season.SPRING; class Season public static final Season SPRING =

8、 new Season(); public static final Season SUMMER = new Season(); public static final Season AUTUMN = new Season(); public static final Season WINTER = new Season(); private Season() ,枚举特点,枚举类型的父类 java.lang.Enum name() ordinal(),public class TestEnum1 public static void main(String args) Season s = S

9、eason.SPRING; System.out.println(s.name();/ SPRING System.out.println(s.ordinal();/ 0 enum Season SPRING, SUMMER, AUTUMN, WINTER ,枚举特点,枚举类型的父类 java.lang.Enum static T valueOf(Class enumType, String name) 极重要的一个静态方法,valueOf,可以用字符串来找到对应枚举对象。,public class TestEnum2 public static void main(String args)

10、Season season = Enum.valueOf(Season.class, “SPRING“); System.out.println(season.name(); ,枚举特点,values(),public class TestEnum3 public static void main(String args) Season seasons = Season.values(); for (Season season : seasons) System.out.println(“name is “ + season.name() + “,ordinal “ + season.ordi

11、nal(); ,枚举特点,枚举类型可以定义属性,并提供相应的方法,enum Season SPRING, SUMMER, AUTUMN, WINTER; private String name; public String getName() return name; public void setName(String name) this.name = name; ,枚举特点,public class TestEnum public static void main(String args) Season s = Season.SPRING; s.setName(“tomcat“); Sy

12、stem.out.println(s.getName(); ,枚举特点,枚举类型有构造方法 但只能是私有的 枚举类型可以显示提供构造方法,enum Season SPRING, SUMMER, AUTUMN, WINTER ,枚举特点,enum Season SPRING(“春天“), SUMMER(“夏天“), AUTUMN(“秋天“), WINTER(“冬天“); private String name; Season(String name) this.name = name; public String getName() return name; public void setNam

13、e(String name) this.name = name; ,枚举特点,枚举不能够继承 枚举类型默认是final修饰符修饰,也是不能被别的类继承 枚举可以提供抽象方法 枚举支持switch case语句(java7中字符串也支持) 枚举是绝对的单例,绝不会出现多个实例,即使反序列化都无法创建多个实例,用枚举来做单例非常简单直接且好用。,枚举特点,enum Operator ADD public double calculate(double a, double b) return a+b; , SUBSTRACT public double calculate(double a, dou

14、ble b) return a-b; , MULTIPLY public double calculate(double a, double b) return a*b; , DIVIED/省略代码; public abstract double calculate(double a,double b); ,枚举特点,public class TestEnum public static void main(String args) Operator o = Operator.ADD; System.out.println(o.calculate(1, 2); ,注解(Annotation),

15、注解的概念 给程序员看的是注释(单行注释、多行注释、doc注释) 注解名 JDK中提供的注解 Override Deprecated SupperessWarnings,注解,覆盖toString()方法,public class Worker private String name; public void m1() public String toString() return name; ,注解,使用注解后,编译器可以检查覆盖方法是否正确,public class Worker private String name; public void m1() Override public S

16、tring toStirng() return name; ,注解,注解的分类 标记注解 单值注解 多值/普通注解 注解的父类 java.lang.annotation.Annotation 自定义注解 public interface 注解名 public interface Test,注解,元注解 Target 限定注解的使用目标 enum ElementType TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE,注解,元注解 Retention 指明注解信息的保存时间

17、 enum RetentionPolicy SOURCE:注解信息只保存在源程序中,在类文件中不保存 CLASS (Default):注解信息保存在类文件中,程序运行时不能通过反射找到 RUNTIME:注解保存在类文件中,程序运行时通过反射API可以找到,注解,完整的注解定义,Target(value = ElementType.TYPE ) Retention(value = RetentionPolicy.RUNTIME) interface First First public class TestAnnotation private String name; public void m

18、1() ,注解,注解属性,Target(value = ElementType.TYPE ) Retention(value = RetentionPolicy.RUNTIME) interface First String value(); First(“test“) public class TestAnnotation private String name; public void m1() ,注解,注解属性的类型共有24种 基本类型, String, Class, enums, annotations, 以及它们的数组,注解案例,通过注解设计一个自动测试的工具,public clas

19、s TestMethod Test(parameter = “corejava“) public void m1(String s1) System.out.println(“method m1 “ + s1); public void m2(String s2) System.out.println(“method m2 “ + s2); ,注解案例,Test注解的设计,Target( ElementType.METHOD ) Retention(RetentionPolicy.RUNTIME) public interface Test String parameter(); ,注解案例,

20、自动测试工具类的设计 如何得知这个类拥有Test注解? 如何获得Test注解中的参数? 如何运行拥有注解的方法?,注解案例,public class TestAnnotation public static void main(String args) throws Exception / 获得反射需要的类对象 Class c = TestMethod.class; TestMethod t = (TestMethod) c.newInstance(); / 获得所有的方法 Method m = c.getDeclaredMethods(); for (Method mm : m) / 判断哪

21、个方法拥有Test标注 if (mm.isAnnotationPresent(Test.class) / 获得Test标注 Test tt = mm.getAnnotation(Test.class); / 获得Parameter属性的值 String name = tt.parameter(); mm.invoke(t, name); ,Java SE 6: 脚本支持,为开发者提供了在同一应用中使用不同语言的能力 使用Java库扩展脚本语言 Sun的SDK中提供了JavaScript引擎 Mozila Rhino引擎 引擎在中 示例:,/ 创建脚本引擎管理器 ScriptEngineMana

22、ger engineManager = new ScriptEngineManager(); / 获得脚本引擎 ScriptEngine engine = engineManager.getEngineByName(“js“); / 执行脚本 try / 注意,这是JavaScript的语法,字符串可以用单引号包围 / 数值型的字符串可以当作数值来运算 engine.eval(“println(123 * 2)“); catch (ScriptException e) e.printStackTrace(); ,Java SE 6: 访问编译器,提供对编译器javac的访问,用于动态生成代码

23、Java工具或框架的开发者经常使用该功能,Java SE 7: 更好的整型字面值,二进制字面值 int mask = 0b101001; long l = 0b1101001010011L; 数值的千分符表示 long creditCardNumber = 1234_5678_9012_3456L; long socialSecurityNumber = 999_99_9999L; float pi = 3.14_15F; long hexBytes = 0xFF_EC_DE_5E; long hexWords = 0xCAFE_BABE; long maxLong = 0x7fff_ffff_ffff_ffffL; byte nybbles = 0b0010_0101; long bytes = 0b11010010_01101001_10010100_10010010;,概述,在本章讨论了: 静态导入 可变长参数 格式化输入输出 枚举 注解 JDK6/JDK7新特性,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1