java5 新特性

2016-05-21 14:50:31   最后更新: 2016-08-05 17:17:38   访问数量:559




java 自诞生之日起就汲取了很多语言的营养,不断更新、丰富自己,让 java 能够不断跟得上潮流,而最具革命性的变革便 2004 年诞生的 java1.5 和 2015 年诞生的 java1.8

本篇日志中我们就来介绍一下 java5 的十余个新特性

 

java5 增加了静态引入的新特性

所谓的静态引入就是在 import 关键字后面增加 static 关键字,引入一个类中的静态成员或静态方法,可以引用某个静态方法,也可以使用 .* 引入类中全部静态方法

package com.techlog.test.service; import static java.lang.System.out; /** * just for test * Created by techlog on 16/5/20. */ public class ForTest { public static void main(String[] argv) { out.println("Hello World!"); } }

 

这里引入了 java.lang.System 类中的静态成员 out,于是在代码中,我们可以直接使用 out.println() 方法

 

很多语言都具有 foreach 循环,java 在 1.5 版本也增加了 foreach 循环的特性:

package com.techlog.test.service; import java.util.Arrays; import java.util.List; import static java.lang.System.out; /** * just for test * Created by techlog on 16/5/20. */ public class ForTest { public static void main(String[] argv) { List<String> slist = Arrays.asList("Buenos Aires", "Córdoba", "La Plata"); for (String s : slist) { out.println(s); } } }

 

 

但是,foreach 循环也具有一些限制,以下常见功能无法实现:

  1. 获取当前遍历元素的 index
  2. 对首个或最后一个做出特殊处理
  3. 遍历的同时删除某个元素

 

基本类型具有了对应的 wrapper 类型:Boolean、Byte、Short、Character、Integer、Long、Float、Double

这个特性是极具价值的,自动将基本类型打包到对应类型可以使方法、容器等的工作更加简单

 

可变参数列表为程序的设计增加了很高的灵活性,虽然这并不是一个常用的特性

package com.techlog.test.service; import static java.lang.System.out; /** * just for test * Created by techlog on 16/5/20. */ public class ForTest { public static int max(int ... nums){ int max = Integer.MIN_VALUE; for(int num : nums) { if(num >= max){ max = num; } } return max; } public static void main(String[] args) { out.println(max(1, 2, 3, 4, 5)); } }

 

 

java1.5 放宽了对类继承过程中方法覆盖的限制,在此之前,除必须一致的方法名及参数列表外,返回类型也必须相同

而 java1.5 以后,子类中覆盖的方法的返回类型可以是父类中被覆盖方法返回类型的子类

这个小小的变化让 java 的面向对象编程更加灵活

package com.techlog.test.service; /** * just for test * Created by techlog on 2016/5/21. */ public class ForTest { public static void main(String[] argv) { A a = new B(); C c = a.func(); System.out.println(c.getI()); } } class A { public C func() { C c = new C(5); System.out.println("A func"); return c; } } class B extends A { @Override public D func() { D d = new D(6); System.out.println("B func"); return d; } } class C { protected int i; public int getI() { System.out.println("C getI"); return i; } public C(int i) { this.i = i; } } class D extends C { @Override public int getI() { System.out.println("D getI"); return i; } public D(int i) { super(i); } }

 

 

打印出了:

B func

D getI

6

 

我们看到,首先打印出的 "B func" 说明继承自 A 类的 B 类成功覆盖了 A 类中的 func 方法,尽管 B 类 func 方法返回类型是父类被覆盖方法返回类型的子类

然后,打印出了 "D getI",这是在 main 方法中调用 c.getI() 方法打印的,这说明,B 类中覆盖的 func 方法确实返回了 D 类型对象

 

java 的注解是 java1.5 引入的新特性,他与类、接口、枚举是在同一个层次,可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释或者进行某些操作

除 @Override 注解显式声明覆盖方法、@SuppressWarnings 注解触发警告等 jdk 定义的注解外,用户也可以自定义注解,在很多框架中,自定义注解可以通过参数化配置复杂的功能,让代码简洁而通用化、模块化,是一种十分实用的特性

 

java Instrumentation 提供了独立于应用程序之外的代理(agent)程序,可以用来监测和协助运行在 JVM 上的应用程序

通过运行时参数,可以在 java 程序的 main 方法执行前先执行某个代理 app

java -javaagent:agent_jar_path[=options] java_app_name

 

 

这样启动的 app 需要满足两个条件:

  1. 在这个 jar 包的 manifest 文件中包含 Premain-Class 属性,并且改属性的值为代理类全路径名
  2. 代理类必须提供一个 public static void premain(String args, Instrumentation inst) 或 public static void premain(String args) 方法

 

通过这样的方式,可以实现面向切面的编程特性

 

在很多语言中,枚举都是一个非常实用的类型,它提供了一个常量的集合,让我们更加方便的管理代码中的常量

java1.5 提供了枚举类型,方便的管理同一类型的常量

java 的 enum 类型

 

泛型支持了“适用于很多类的类型”,也就是参数化类型,使程序可以应用于多种类型,这样泛化的思想为程序设计增添了更高的灵活性

java 泛型

 

简单地说,java 的反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法

RTT、Class 对象与反射

 

自 java1.5 开始,java 提供了类似 C 语言中标准输出函数参数列表格式化输出的功能

java 格式化输出

 

java5 原生提供了用来阻塞线程直到某些状态条件开启的闭锁机制

java 线程同步工具类

 

jvm 在 server 模式下虽然启动较慢,但拥有很高的性能,client 模式下则与此相反,他拥有更高的启动速度,但性能较低

java5 实现了在未显式指定该参数的情况下根据 java 实际的执行环境来自动判断并应用相应设置

jvm client 模式与 server 模式

 

Arrays

java1.5 提供了 Arrays 工具类,它提供了几个十分实用的容器类操作方法:

Arrays.sort(myArray); Arrays.toString(myArray) Arrays.binarySearch(myArray, 98) Arrays.deepToString(ticTacToe) Arrays.deepEquals(ticTacToe, ticTacToe3)

 

 

Queue

java5 在 LinkedList 中添加了 offer 和 poll 操作,他们主要是用来实现 Queue 的入队和出队功能

offer、poll 与 add、remove 的区别在于他们不会抛出异常

 

控制台输入

java5 增加了 Scanner 类,通过 Scanner in = new Scanner(System.in); 然后通过 Scanner 对象可以实现控制台输入的控制,如 int i = in.nextInt();

 

JUC 类库及线程池

这个会在之后单独的 java 并发编程中详细介绍,敬请期待

 

 

 






技术帖      技术分享      java      jdk      java5      j2ee      jdk1.5      新特性      特性     


京ICP备15018585号