1 泛型(Generic)1.1 说明增强了java的类型安全,可以在编译期间对容器内的对象进行类型检查,在运行期不必进行类型的转换。而在j2se5之前必须在运行期动态进行容器内对象的检查及转换 减少含糊的容器,可以定义什么类型的数据放入容器 ArrayList<Integer> listOfIntegers; // <TYPE_NAME> is new to the syntax 1.2 用法 声明及实例化泛型类: HashMap<String,Float> hm = new HashMap<String,Float>(); J2SE 5.0目前不支持原始类型作为类型参数(type parameter) 定义泛型接口: public interface GenInterface<T> { 定义泛型类: public class ArrayList<ItemType> { ... } 例1: public class MyList<Element> extends LinkedList<Element> 例2: public class GenList <T>{ 泛型方法: public class TestGenerics{
1.3 受限泛型 受限泛型是指类型参数的取值范围是受到限制的. extends关键字不仅仅可以用来声明类的继承关系, 也可以用来声明类型参数(type parameter)的受限关系.例如, 我们只需要一个存放数字的列表, 包括整数(Long, Integer, Short), 实数(Double, Float), 不能用来存放其他类型, 例如字符串(String), 也就是说, 要把类型参数T的取值泛型限制在Number极其子类中.在这种情况下, 我们就可以使用extends关键字把类型参数(type parameter)限制为数字 示例 public class Limited<T extends Number> { 1.4 泛型与异常 类型参数在catch块中不允许出现,但是能用在方法的throws之后。例: import java.io.*; 1.5 泛型的通配符"?" "?"可以用来代替任何类型, 例如使用通配符来实现print方法。 public static void print(GenList<?> list) {}) 1.6 泛型的一些局限型 不能实例化泛型 T t = new T(); //error 不能实例化泛型类型的数组 T[] ts= new T[10]; //编译错误 不能实例化泛型参数数 Pair<String>[] table = new Pair<String>(10); // ERROR 类的静态变量不能声明为类型参数类型 public class GenClass<T> { 泛型类不能继承自Throwable以及其子类 public GenExpection<T> extends Exception{} //编译错误 不能用于基础类型int等 Pair<double> //error |
2 增强循环(Enhanced for Loop)旧的循环 LinkedList list = new LinkedList(); 新的循环 LinkedList<String> list = new LinkedList<String>(); 很清晰、方便,一看便知其用法 3 可变参数(Variable Arguments)实现了更灵活的方法参数传入方式,System.out.printf是个很好的例子 用法:void test(Object … args) 一个很容易理解的例子 public static int add(int ... args){ 4 自动实现装箱和解箱操作(Boxing/Unboxing Conversions)说明:实现了基本类型与外覆类之间的隐式转换。基本类型至外覆类的转换称为装箱,外覆类至基本类型的转换为解箱。这些类包括 Primitive Type Reference Type 例如,旧的实现方式 Integer intObject; 新的实现方式 int intPrimitive; 5 静态导入(Static Imports)很简单的东西,看一个例子: 没有静态导入 Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); 有了静态导入 import static java.lang.Math.*; 其中import static java.lang.Math.*;就是静态导入的语法,它的意思是导入Math类中的所有static方法和属性。这样我们在使用这些方法和属性时就不必写类名。 需要注意的是默认包无法用静态导入,另外如果导入的类中有重复的方法和属性则需要写出类名,否则编译时无法通过。 |
6 枚举类(Enumeration Classes)用法:public enum Name {types, ….} 简单的例子: public enum Colors {Red, Yellow, Blue, Orange, Green, Purple, Brown, Black} 又一个简单例子: import java.util.*; 应运enum简写的例子: import java.util.*; enum类中拥有方法的一个例子: enum ProgramFlags { |
7 元数据(Meta data)请参考 http://www-900.ibm.com/developerWorks/cn/java/j-annotate1/ http://www-900.ibm.com/developerworks/cn/java/j-annotate2.shtml 8 Building Strings(StringBuilder类)在JDK5.0中引入了StringBuilder类,该类的方法不是同步(synchronized)的,这使得它比StringBuffer更加轻量级和有效。 9 控制台输入(Console Input)在JDK5.0之前我们只能通过JOptionPane.showInputDialog进行输入,但在5.0中我们可以通过类Scanner在控制台进行输入操作 例如在1.4中的输入 String input = JOptionPane.showInputDialog(prompt); 在5.0中我们可以 Scanner in = new Scanner(System.in); 10 Covariant Return Types(不晓得怎么翻译,大概是 改变返回类型)JDK5之前我们覆盖一个方法时我们无法改变被方法的返回类型,但在JDK5中我们可以改变它 例如1.4中我们只能 public Object clone() { ... } 但是在5.0中我们可以改变返回类型为Employee public Employee clone() { ... } 11 格式化I/O(Formatted I/O)增加了类似C的格式化输入输出,简单的例子: public class TestFormat{ 输出结果为: 150000 10 249f0 a 5.01 3.1 5.010e+00 3.140e+02 |
下面是一些格式化参数说明(摘自Core Java 2 Volume I - Fundamentals, Seventh Edition)
Table 3-5. Conversions for printf
Conversion Character | Type | Example |
d | Decimal integer | 159 |
x | 9f | |
o | Octal integer | 237 |
f | Fixed-point floating-point | 15.9 |
e | Exponential floating-point | 1.59E+01 |
g | General floating-point (the shorter of e and f) |
|
a | Hexadecimal floating point | 0x1.fccdp3 |
s | String | Hello |
c | Character | H |
b | Boolean | TRUE |
h | Hash code | 42628b2 |
tx | Date and time | |
% | The percent symbol | % |
n | The platform-dependent line separator |
|
Table 3-7. Date and Time Conversion Characters
Conversion Character | Type | Example |
C | Complete date and time | Mon Feb 09 18:05:19 PST 2004 |
F | ISO 8601 date | 2004-02-09 |
D | U.S. formatted date (month/day/year) | 02/09/2004 |
T | 24-hour time | 18:05:19 |
r | 12-hour time | 06:05:19 pm |
R | 18:05 | |
Y | Four-digit year (with leading zeroes) | 2004 |
y | Last two digits of the year (with leading zeroes) | 04 |
C | First two digits of the year (with leading zeroes) | 20 |
B | Full month name | February |
b or h | Feb | |
m | Two-digit month (with leading zeroes) | 02 |
d | 09 | |
e | Two-digit day (without leading zeroes) | 9 |
A | Full weekday name | Monday |
a | Abbreviated weekday name | Mon |
j | Three-digit day of year (with leading zeroes), between 001 and 366 | 069 |
H | Two-digit hour (with leading zeroes), between 00 and 23 | 18 |
k | Two-digit hour (without leading zeroes), between 0 and 23 | 18 |
I | Two-digit hour (with leading zeroes), between 01 and 12 | 06 |
l | Two-digit hour (without leading zeroes), between 1 and 12 | 6 |
M | Two-digit minutes (with leading zeroes) | 05 |
S | Two-digit seconds (with leading zeroes) | 19 |
L | Three-digit milliseconds (with leading zeroes) | 047 |
N | Nine-digit nanoseconds (with leading zeroes) | 047000000 |
P | Uppercase morning or afternoon marker | PM |
p | Lowercase morning or afternoon marker | pm |
z | RFC 822 numeric offset from GMT | -0800 |
Z | Time zone | PST |
s | Seconds since 1970-01-01 00:00:00 GMT | 1078884319 |
E | 1078884319047 |
Table 3-6. Flags for printf
Flag | Purpose | Example |
+ | Prints sign for positive and negative numbers | +3333.33 |
space | Adds a space before positive numbers | | 3333.33| |
0 | Adds leading zeroes | 003333.33 |
- | Left-justifies field | |3333.33 | |
( | Encloses negative number in parentheses | (3333.33) |
, | Adds group separators | 3,333.33 |
# (for f format) | Always includes a decimal point | 3,333. |
# (for x or o format) | Adds 0x or 0 prefix | 0xcafe |
^ | Converts to upper case | 0XCAFE |
$ | Specifies the index of the argument to be formatted; for example, %1$d %1$x prints the first argument in decimal and hexadecimal | 159 9F |
< | Formats the same value as the previous specification; for example, %d %<x prints the same number in decimal and hexadecimal |
|
这里是一些简单的介绍,更详细的说明请参考:
Core Java 2 Volume I - Fundamentals, Seventh Edition
Core Java 2 Volume II - Advanced Features, Seventh Edition
里面都有一些很精彩的描述,中文名称就是《Java核心技术》。只有第七版才有J2SE5.0的介绍,但是第七版好像还没有中文版。本文还参考了Professional Java JDK - 5th Edition.