随着Java 5的发布(也称为Java 1.5或Tiger),Java语言及核心API中添加了一些重要的新特性。本章将通过示例来介绍一些新特性以及Java开发人员不了解的一些有用的类和方法。Java API 非常庞大,它的类超过3000个,要想了解所有的内容非常困难。在核心软件包中,有一些类甚至连有经验的Java开发人员都可能忽视,或许是因为他们以前从未接触过这些类或者不需要使用它们。
很多编程人员把Java仅作为另一种语言和语法来学习。但是高效的Java编程人员是从对象层次结构、行为和关系的角度来审视Java,而不是像在过程语言中那样从函数调用和过程的角度来学习Java。在介绍性讨论中,将强调Java的以下三个相关的部分。
面向对象的语言
高效地使用Java意味着要理解面向对象编程(object-oriented programming,OOP),而不仅仅是Java的语法。如果你对过程语言,如C或Pascal语言,比较熟悉,那么在编写Java代码之前亲自熟悉OOP是非常重要的。本书假定你已经在某种程度上使用过Java。如果你不熟悉OOP,可以在网站http://java.sun.com/docs/books/tutorial/java/ concepts上找到有关OOP的介绍。此外,本章还会讨论一些最新的语法变化。
Java虚拟机(Java Virtual Machine,JVM)
当Java发布时,它最引人注目的方面就是它的Java虚拟机。不同于其他语言中需要为每个目标平台重新编译或修改源代码,Java中只需要编译源代码一次。然后可以在已安装JVM的任何目标系统上运行可执行代码,或字节码(bytecode)。字节码就像一种跨平台的机器语言。除了Java外,其他语言也可以编译成JVM字节码,在后面的章节中会看到这方面的内容。
核心API
Java核心库的规模有时对开发人员来说过于庞大。它包括针对网络、图形、声音、多线程、I/O、安全、加密、数据库、XML以及很多其他方面的软件包。在后续章节中,将会探讨一些核心API的高级特性。此外,还会介绍一些开放源代码的Java项目,这些项目能提供核心API未提供的有用功能。本章中,我们会使用少量核心类和一些源自Java 5的新语法。
.1 在Java中没有for:使用增强的for循环
在一些编程语言中,通过列表或数组可以非常方便地进行遍历,通过一个循环即可逐个遍历项并将该项赋值一个局部变量从而实现自动循环。目前在Java中有了真正的for!
考虑这样一种情况,你希望对一个整型对象集合(如java.util.ArrayList)中的所有数值求和。你很可能编写过类似于下面这样的代码:
ArrayList theList = new ArrayList();
theList.add(new Integer(2));
theList.add(new Integer(3));
theList.add(new Integer(5));
theList.add(new Integer(7));
int sum = 0;
// The old way to iterate
for (Iterator iter = theList.iterator(); iter.hasNext(); ) {
Integer x = (Integer) iter.next();
sum = sum + x.intValue();
}
System.out.println("The sum is " + sum);
这段代码多麻烦啊,难道编译器不应该知道你正在进行迭代吗?毕竟这是一个for循环,不是吗?而在Java 5中,增强的for循环现已支持集合对象。因此不再需要使用迭代器。在下面的修订的代码中,一个for循环通过列表进行迭代并显示出每个值:
ArrayList<Integer> theList = new ArrayList<Integer>();
theList.add(2);
theList.add(3);
theList.add(5);
theList.add(7);
int sum = 0;
// new Java 5 iteration syntax
for (Integer item : theList) {
sum = sum + item;
}
System.out.println("The sum is " + sum);
for循环定义了一个叫做item的局部变量,在每次迭代过程中,它将得到列表中的下一个值。除了完美的for循环语法外,此代码在以下两个方面也不同于过去的Java代码。
使用了泛型
上面带有尖括号的语法是Java 5新增加的泛型特性。泛型允许为一些具体类型的对象定义类,但是直到创建该类的一个实例时才能知道具体的类型。编译器将会强迫执行类型检查。在这个示例中,ArrayList是一个特殊的类,对于add方法它只接受整数(并只从它的Iterator的next方法中返回整数)。这意味着当从列表中检索对象时不需要强制类型转换,可以立即将它们作为Integer实例来对待。不使用泛型时,仍可以使用新的for循环语法,但需要将Object强制转换成Integer。在1.4节中将我们更详细地介绍泛型。
整型对象到整型数值的自动转换
在Java 5中,可以将Integer对象作为int来对待。编译器将自动执行从int到Integer对象的转换(反之亦然),此过程称为自动装箱(autoboxing)。当循环中得到一个Integer对象时,可以将它与一个int值相加而不需要执行显式的转换。
新的for语言也适用于数组:
int[] theList = new int[] {2,3,5,7};
int sum = 0;
for (int x : theList) {
sum = sum + x;
}
System.out.println("The sum is " + sum);
这种新的语法的确使代码变得更加易读和紧凑。但还不能完全放弃迭代器,至少暂时是这样,因为还有很多开发人员没有将他们的JDK升级到版本5。
很多编程人员把Java仅作为另一种语言和语法来学习。但是高效的Java编程人员是从对象层次结构、行为和关系的角度来审视Java,而不是像在过程语言中那样从函数调用和过程的角度来学习Java。在介绍性讨论中,将强调Java的以下三个相关的部分。
面向对象的语言
高效地使用Java意味着要理解面向对象编程(object-oriented programming,OOP),而不仅仅是Java的语法。如果你对过程语言,如C或Pascal语言,比较熟悉,那么在编写Java代码之前亲自熟悉OOP是非常重要的。本书假定你已经在某种程度上使用过Java。如果你不熟悉OOP,可以在网站http://java.sun.com/docs/books/tutorial/java/ concepts上找到有关OOP的介绍。此外,本章还会讨论一些最新的语法变化。
Java虚拟机(Java Virtual Machine,JVM)
当Java发布时,它最引人注目的方面就是它的Java虚拟机。不同于其他语言中需要为每个目标平台重新编译或修改源代码,Java中只需要编译源代码一次。然后可以在已安装JVM的任何目标系统上运行可执行代码,或字节码(bytecode)。字节码就像一种跨平台的机器语言。除了Java外,其他语言也可以编译成JVM字节码,在后面的章节中会看到这方面的内容。
核心API
Java核心库的规模有时对开发人员来说过于庞大。它包括针对网络、图形、声音、多线程、I/O、安全、加密、数据库、XML以及很多其他方面的软件包。在后续章节中,将会探讨一些核心API的高级特性。此外,还会介绍一些开放源代码的Java项目,这些项目能提供核心API未提供的有用功能。本章中,我们会使用少量核心类和一些源自Java 5的新语法。
.1 在Java中没有for:使用增强的for循环
在一些编程语言中,通过列表或数组可以非常方便地进行遍历,通过一个循环即可逐个遍历项并将该项赋值一个局部变量从而实现自动循环。目前在Java中有了真正的for!
考虑这样一种情况,你希望对一个整型对象集合(如java.util.ArrayList)中的所有数值求和。你很可能编写过类似于下面这样的代码:
ArrayList theList = new ArrayList();
theList.add(new Integer(2));
theList.add(new Integer(3));
theList.add(new Integer(5));
theList.add(new Integer(7));
int sum = 0;
// The old way to iterate
for (Iterator iter = theList.iterator(); iter.hasNext(); ) {
Integer x = (Integer) iter.next();
sum = sum + x.intValue();
}
System.out.println("The sum is " + sum);
这段代码多麻烦啊,难道编译器不应该知道你正在进行迭代吗?毕竟这是一个for循环,不是吗?而在Java 5中,增强的for循环现已支持集合对象。因此不再需要使用迭代器。在下面的修订的代码中,一个for循环通过列表进行迭代并显示出每个值:
ArrayList<Integer> theList = new ArrayList<Integer>();
theList.add(2);
theList.add(3);
theList.add(5);
theList.add(7);
int sum = 0;
// new Java 5 iteration syntax
for (Integer item : theList) {
sum = sum + item;
}
System.out.println("The sum is " + sum);
for循环定义了一个叫做item的局部变量,在每次迭代过程中,它将得到列表中的下一个值。除了完美的for循环语法外,此代码在以下两个方面也不同于过去的Java代码。
使用了泛型
上面带有尖括号的语法是Java 5新增加的泛型特性。泛型允许为一些具体类型的对象定义类,但是直到创建该类的一个实例时才能知道具体的类型。编译器将会强迫执行类型检查。在这个示例中,ArrayList是一个特殊的类,对于add方法它只接受整数(并只从它的Iterator的next方法中返回整数)。这意味着当从列表中检索对象时不需要强制类型转换,可以立即将它们作为Integer实例来对待。不使用泛型时,仍可以使用新的for循环语法,但需要将Object强制转换成Integer。在1.4节中将我们更详细地介绍泛型。
整型对象到整型数值的自动转换
在Java 5中,可以将Integer对象作为int来对待。编译器将自动执行从int到Integer对象的转换(反之亦然),此过程称为自动装箱(autoboxing)。当循环中得到一个Integer对象时,可以将它与一个int值相加而不需要执行显式的转换。
新的for语言也适用于数组:
int[] theList = new int[] {2,3,5,7};
int sum = 0;
for (int x : theList) {
sum = sum + x;
}
System.out.println("The sum is " + sum);
这种新的语法的确使代码变得更加易读和紧凑。但还不能完全放弃迭代器,至少暂时是这样,因为还有很多开发人员没有将他们的JDK升级到版本5。