新特性介绍.doc
文本预览下载声明
Java 新特性介绍
Generic Types
Autoboxing
Enhanced for loop
Enumerated types
Static Import
Generic Types
C++ 中的泛型
先前撰写 C++ 时,还没有泛型(Generic types)的字眼出现,最多是使用 template 来达成对不同型别的支持。像是:
template class Type class Stack { Type st[MAX]; int t;
public: void push(Type v); // other code
}; Stack s; // declare
不过在 C++ STL (Standard Template Library) 出现,各个 C++ 编译器相继支持后,泛型一词才在信息界中广为流传。STL 提供了字符串、容器、算法等众多功能,使得 C++ 增色不少,其中泛型是相当重要的概念。无论是各种类别,都可以放在容器之中,并且使用算法函式库来处理。例如:
vectorstring *dirs = new vectorstring; // data
list addSomeData(dirs); sort(dirs-begin(), dirs-end()); // sort list
typedef vectorstring::iterator iter; typedef string::size_type
size_type; for (iter it = dirs-begin(); it != dirs-end(); it++) {
size_type dpos = (*it).find_last_of(.); // find . string fileName =
(*it).replace(dpos + 1, 3, txt); //replace coutRead
(*it) and create fileName; }
C++ 有泛型的出现,很大一个原因是为了要处理各种不同的型别,包括了 STL 中新增和使用者自行定义的部份。和 C++ 不同的是,Java 一开始并没有这样的设计,因为 Java 所有的对象都有共同的祖先:java.lang.Object,所以 Java 中的函式若要处理多型别时,只需适当地定义参数和(或)传回值为 Object 即可,这正是多型的彻底应用之一。反之 C++ 中的类别没有这关的关系,因此泛型在 C++ 中就显得特别重要。
不过在这边有些缺点。因为 C++ 的泛型是使用 template 来达成的,而 template 会在遇到不同型别时产生相对应的副本。例如 Type add(Type t, Type s) 这项函式定义会在 add(4, 1) 时出现 int add(int, int) 的程序代码,并在 add(1.1, 2.2) 时出现 float add(float, float) 的程序代码,也就是整个整式因为这个关系,而变得愈来愈肥大。
Java 中的泛型
Java 1.5 中已经支持泛型了。目前主要在 java.util 中的类别有比较多的例子,另外还有在 java.lang.Comparable, java.lang.Class, java.lang.Enum 及其相关类别。底下是用 List 和 Vector 来测试泛型:
import java.util.*; public class GenericTest { public static void
main(String[] args) { int size = 6; ListInteger list = new
VectorInteger(); for (int i = 0; i size; i++) { list.add(new
Integer(size - i)); } for (int i = 0; i size; i++) {
System.out.print(list.get(i).intValue() + -); } } } 执行结果: 6-5-4-3-2-1-
泛型在此所带来的好处是只要在宣告时我们指定好类别,那么接下来后面的程序中它会自动帮我们转型, 并且也会检查后续加入容器中的对象是否可转型成我们指定的类别。上例中,如果增加一行 list.add(test); ,那么在编译时就会出现错误,会说 cannot find symbol : method add(java.lang.String) 。这使得原本放在执行阶段才会检查出来的问题,提升到了编译时期。降低了 bug 出现的机会,也让程序设计师在除错上方便许多。另外 Ja
显示全部