`
CherryRemind
  • 浏览: 54682 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDK5.0的11个主要新特征[Tommy]

    博客分类:
  • Java
阅读更多

 关键字    JDK5.0的11个主要新特征

1 泛型(Generic)

1.1 说明

增强了java的类型安全,可以在编译期间对容器内的对象进行类型检查,在运行期不必进行类型的转换。而在j2se5之前必须在运行期动态进行容器内对象的检查及转换减少含糊的容器,可以定义什么类型的数据放入容器

java 代码
 
  1. ArrayList listOfIntegers; //  is new to the syntax  
  2.   
  3. Integer integerObject;  
  4.   
  5. listOfIntegers = new ArrayList(); // is new to the syntax  
  6.   
  7. listOfIntegers.add(new Integer(10)); // 只能是Integer类型  
  8.   
  9. integerObject = listOfIntegers.get(0); // 取出对象不需要转换  

1.2 用法

声明及实例化泛型类:

HashMap

//不能使用原始类型

GenList<int> nList = new GenList<int>(); //编译错误</int></int>

J2SE 5.0目前不支持原始类型作为类型参数(type parameter)

定义泛型接口:

java 代码
 
  1. public interface GenInterface {  
  2.   
  3.      void func(T t);  
  4.   
  5. }  

public interface GenInterface<t> {</t>

void func(T t);

}

定义泛型类:

public class ArrayList<itemtype> { ... }</itemtype>

public class GenMap

例1:

java 代码
 
  1. public class MyList extends LinkedList  
  2.   
  3. {  
  4.   
  5.    public void swap(int i, int j)  
  6.   
  7.   {  
  8.   
  9.         Element temp = this.get(i);  
  10.     
  11.         this.set(i, this.get(j));  
  12.   
  13.         this.set(j, temp);  
  14.   
  15.    }  
  16.   
  17.    public static void main(String[] args)  
  18.   {  
  19.   
  20.       MyList list = new MyList();  
  21.   
  22.       list.add("hi");  
  23.   
  24.       list.add("andy");  
  25.   
  26.       System.out.println(list.get(0) + " " + list.get(1));  
  27.   
  28.        list.swap(0,1);  
  29.   
  30.       System.out.println(list.get(0) + " " + list.get(1));  
  31.     }  
  32.   
  33. }  

java 代码
 
  1. public class MyList extends LinkedList  
  2.   
  3. {  
  4.   
  5. public void swap(int i, int j)  
  6.   
  7. {  
  8.   
  9. Element temp = this.get(i);  
  10.   
  11. this.set(i, this.get(j));  
  12.   
  13. this.set(j, temp);  
  14.   
  15. }  
  16.   
  17. public static void main(String[] args)  
  18.   
  19. {  
  20.   
  21. MyList list = new MyList();  
  22.   
  23. list.add("hi");  
  24.   
  25. list.add("andy");  
  26.   
  27. System.out.println(list.get(0) + " " + list.get(1));  
  28.   
  29. list.swap(0,1);  
  30.   
  31. System.out.println(list.get(0) + " " + list.get(1));  
  32.   
  33. }  
  34.   
  35. }  

例2:

public class GenList <t>{</t>

private T[] elements;

private int size = 0;

private int length = 0;

public GenList(int size) {

elements = (T[])new Object[size];

this.size = size;

}

public T get(int i) {

if (i < length) {

return elements[i];

}

return null;

}

public void add(T e) {

if (length < size - 1)

elements[length++] = e;

}

}

泛型方法:

public class TestGenerics{

public <t> String getString(T obj) { //实现了一个泛型方法</t>

return obj.toString();

}

public static void main(String [] args){

TestGenerics t = new TestGenerics();

String s = "Hello";

Integer i = 100;

System.out.println(t.getString(s));

System.out.println(t.getString(i));

}

}

1.3 受限泛型

  受限泛型是指类型参数的取值范围是受到限制的. extends关键字不仅仅可以用来声明类的继承关系, 也可以用来声明类型参数(type parameter)的受限关系.例如, 我们只需要一个存放数字的列表, 包括整数(Long, Integer, Short), 实数(Double, Float), 不能用来存放其他类型, 例如字符串(String), 也就是说, 要把类型参数T的取值泛型限制在Number极其子类中.在这种情况下, 我们就可以使用extends关键字把类型参数(type parameter)限制为数字

示例

public class Limited<t number="" extends=""> {</t>

public static void main(String[] args) {

Limited<integer> number; //正确</integer>

Limited<string> str; //编译错误</string>

}

}

1.4 泛型与异常

类型参数在catch块中不允许出现,但是能用在方法的throws之后。例:

import java.io.*;

interface Executor<e exception="" extends=""> {</e>

void execute() throws E;

}

public class GenericExceptionTest {

public static void main(String args[]) {

try {

Executor<ioexception> e = new Executor<ioexception>() {</ioexception></ioexception>

public void execute() throws IOException{

// code here that may throw an

// IOException or a subtype of

// IOException

}

};

e.execute();

} catch(IOException ioe) {

System.out.println("IOException: " + ioe);

ioe.printStackTrace();

}

}

}

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</string></string>

类的静态变量不能声明为类型参数类型

public class GenClass<t> {</t>

private static T t; //编译错误

}

泛型类不能继承自Throwable以及其子类

public GenExpection<t> extends Exception{} //编译错误</t>

不能用于基础类型int等

Pair<double> //error</double>

Pair<double> //right</double>

2 增强循环(Enhanced for Loop)

旧的循环

LinkedList list = new LinkedList();

list.add("Hi");

list.add("everyone!");

list.add("Was");

list.add("the");

list.add("pizza");

list.add("good?");

for (int i = 0; i < list.size(); i++)

System.out.println((String) list.get(i));

//或者用以下循环

//for(Iterator iter = list.iterator(); iter.hasNext(); ) {

//Integer stringObject = (String)iter.next();

// ... more statements to use stringObject...

//}

新的循环

LinkedList<string> list = new LinkedList<string>(); </string></string>

list.add("Hi");

list.add("everyone!");

list.add("Was");

list.add("the");

list.add("pizza");

list.add("good?");

for (String s : list)

System.out.println(s);

很清晰、方便,一看便知其用法

3 可变参数(Variable Arguments)

实现了更灵活的方法参数传入方式,System.out.printf是个很好的例子

用法:void test(Object … args)

一个很容易理解的例子

public static int add(int ... args){

int total = 0;

for (int i = 0; i < args.length; i++)

total += args[i];

return total;

}

public static void main(String[] args){

int a;

a = Varargs.add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

System.out.println(a);

}

4 自动实现装箱和解箱操作(Boxing/Unboxing Conversions)

说明:实现了基本类型与外覆类之间的隐式转换。基本类型至外覆类的转换称为装箱,外覆类至基本类型的转换为解箱。这些类包括

Primitive Type Reference Type

boolean Boolean

byte Byte

char Character

short Short

int Integer

long Long

float Float

double Double

例如,旧的实现方式

Integer intObject;

int intPrimitive;

ArrayList arrayList = new ArrayList();

intPrimitive = 11;

intObject = new Integer(intPrimitive);

arrayList.put(intObject); // 不能放入int类型,只能使Integer

新的实现方式

int intPrimitive;

ArrayList arrayList = new ArrayList();

intPrimitive = 11;

//在这里intPrimitive被自动的转换为Integer类型

arrayList.put(intPrimitive);

5 静态导入(Static Imports)

很简单的东西,看一个例子:

没有静态导入

Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));

有了静态导入

import static java.lang.Math.*;

sqrt(pow(x, 2) + pow(y, 2));

 

其中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}

public static void main(String[] args){

Colors myColor = Colors.Red;

System.out.println(myColor);

}

又一个简单例子:

import java.util.*;

enum OperatingSystems {windows, unix, linux, macintosh}

public class EnumExample1 {

public static void main(String args[]) {

OperatingSystems os;

os = OperatingSystems.windows;

switch(os) {

case windows:

System.out.println(“You chose Windows!”);

break;

case unix:

System.out.println(“You chose Unix!”);

break;

case linux:

System.out.println(“You chose Linux!”);

break;

case macintosh:

System.out.println(“You chose Macintosh!”);

break;

default:

System.out.println(“I don’t know your OS.”);

break;

}

}

}

应运enum简写的例子:

import java.util.*;

public class EnumTest

{
public static void main(String[] args)

{

Scanner in = new Scanner(System.in);

System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");

String input = in.next().toUpperCase();

Size size = Enum.valueOf(Size.class, input);

System.out.println("size=" + size);

System.out.println("abbreviation=" + size.getAbbreviation());

if (size == Size.EXTRA_LARGE)

System.out.println("Good job--you paid attention to the _.");

}

}

enum Size

{

SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");

private Size(String abbreviation) { this.abbreviation = abbreviation; }

public String getAbbreviation() { return abbreviation; }

private String abbreviation;

}

enum类中拥有方法的一个例子:

enum ProgramFlags {

showErrors(0x01),

includeFileOutput(0x02),

useAlternateProcessor(0x04);

private int bit;

ProgramFlags(int bitNumber) {

bit = bitNumber;

}

public int getBitNumber() {

return(bit);

}

}

public class EnumBitmapExample {

public static void main(String args[]) {

ProgramFlags flag = ProgramFlags.showErrors;

System.out.println(“Flag selected is: “ +

flag.ordinal() +

“ which is “ +

flag.name());

}

}

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);

int n = Integer.parseInt(input);

double x = Double.parseDouble(input);

s = input;

在5.0中我们可以

Scanner in = new Scanner(System.in);

System.out.print(prompt);

int n = in.nextInt();

double x = in.nextDouble();

String s = in.nextLine();

10 Covariant Return Types(不晓得怎么翻译,大概是 改变返回类型)

JDK5之前我们覆盖一个方法时我们无法改变被方法的返回类型,但在JDK5中我们可以改变它

例如1.4中我们只能

public Object clone() { ... }

...

Employee cloned = (Employee) e.clone();

但是在5.0中我们可以改变返回类型为Employee

public Employee clone() { ... }

...

Employee cloned = e.clone();

11 格式化I/O(Formatted I/O)

增加了类似C的格式化输入输出,简单的例子:

public class TestFormat{

public static void main(String[] args){

int a = 150000, b = 10;

float c = 5.0101f, d = 3.14f;

System.out.printf("%4d %4d%n", a, b);

System.out.printf("%x %x%n", a, b);

System.out.printf("%3.2f %1.1f%n", c, d);

System.out.printf("%1.3e %1.3e%n", c, d*100);

}

}

输出结果为:

150000 10

249f0 a

5.01 3.1

5.010e+00 3.140e+02

分享到:
评论

相关推荐

    JDK5.0的11个主要新特征

    JDK5.0是Java开发的一个重要里程碑,它引入了11个主要的新特性,极大地提升了编程效率和代码安全性。以下是对这些特性的详细说明: 1. 泛型(Generic) 泛型的引入是为了解决类型安全问题,避免在运行时进行不必要...

    JDK 5.0.zip

    **JDK 5.0** 是Java开发工具集(Java Development Kit)的一个重要版本,它在Java编程领域具有里程碑式的意义。此版本的发布在2004年,带来了许多新特性和改进,极大地提升了Java语言的开发效率和程序性能。下面我们...

    JDK5.0_下载-安装-配置

    JDK5.0是Oracle公司于2004年发布的一个重要版本,引入了许多新特性,对Java编程语言做了重大改进,提升了开发效率。要下载JDK5.0,首先访问Oracle的官方网站历史版本页面,或者通过互联网上的存档链接找到该版本的...

    JDK5.0的11个主要新特征.doc

    ### JDK5.0 的 11 个主要新特性 #### 1. 泛型 (Generics) **1.1 说明** Java 5.0 引入了泛型的概念,这大大增强了 Java 语言的类型安全性。通过泛型,开发人员可以在编译阶段而不是运行时对容器内的对象进行类型...

    jdk5.0新特性

    在JDK 5.0中,引入了一个非常实用的功能——自动装箱和自动拆箱,这极大地方便了开发者在处理基本数据类型和它们对应的封装类之间的转换。以前,我们可能需要手动将一个`int`类型转换成`Integer`,或者反过来,但...

    良葛格JDK5.0学习笔记

    《良葛格JDK5.0学习笔记》是一份详细记录了Java开发工具包(JDK)5.0版本核心特性和技术要点的学习资料。这份笔记涵盖了Java编程语言的重要更新和改进,对于深入理解JDK5.0及其对Java开发的影响至关重要。 1. **...

    良葛格java jdk 5.0学习笔记

    良葛格java jdk 5.0学习笔记,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip,良葛格java jdk 5.0学习笔记.zip。

    jdk5.0 tomcat5.0配置全攻略

    本篇文章旨在帮助那些在Java学习过程中遇到环境配置问题的朋友,提供一份详尽的JDK 5.0 和 Tomcat 5.0 的安装与配置指南。 #### JDK 5.0 安装与配置 1. **下载JDK 5.0**: - 访问Sun官方站点...

    (Java 2 SDK)JDK 5.0 的源代码

    JDK 5.0是这个平台的一个重要版本,它引入了许多创新特性,极大地提升了开发效率和代码质量。 一、泛型(Generics) JDK 5.0的最大亮点之一就是泛型的引入。泛型允许在定义类、接口和方法时指定类型参数,从而提高...

    良葛格Java JDK 5.0学习笔记

    Java JDK 5.0是Java发展历程中的一个重要里程碑,它引入了许多新特性,极大地提升了开发效率和代码质量。这里,我们将详细探讨这个版本的关键知识点,帮助初学者更好地理解和掌握Java编程。 1. **自动类型推断(var...

    良葛格Java JDK 5.0学习笔记[可打印]

    Java JDK 5.0是Java开发的一个里程碑版本,它引入了许多重要的新特性和改进,极大地提升了开发效率和代码质量。良葛格的Java JDK 5.0学习笔记是一份宝贵的资源,适合初学者和有经验的开发者回顾这个版本的关键概念。...

    jdk 5.0 ban

    JDK 5.0是一个重要的版本,它在2004年发布,引入了许多创新特性,对Java编程语言进行了重大改进,提升了开发效率。 1. **泛型(Generics)**:JDK 5.0引入了泛型,允许开发者在类、接口和方法中定义类型参数,增强...

    ibm JDK5.0 fro linux

    ibm JDK5.0 fro linux,这个东西很难下的。

    良葛格————JavaJDK5.0学习笔记PDF

    良葛格————JavaJDK5.0学良葛格————JavaJDK5.0学习笔记PDF.rar习笔记PDF.rar良葛格良葛格————JavaJDK5.0学习笔记PDF.rar————JavaJDK5.0学习笔记PDF.rar良葛格————JavaJDK5.0学习笔记PDF.rar良...

    JDK 5.0中文版API

    JDK 5.0是一个重要的里程碑,它引入了许多创新特性,极大地提升了Java的效率和可维护性。这篇文档将详细解析JDK 5.0中文版API,帮助初学者和有经验的开发者更好地理解和利用这一强大的资源。 ### 类库概述 JDK 5.0...

    JAVA(JDK5.0)学习笔记

    ### JAVA(JDK5.0)学习笔记:深入理解数组与对象的关系 在深入探讨JAVA(JDK5.0)中数组的特性和应用之前,我们首先需要认识到数组在Java中的地位和作用远超于传统编程语言中纯粹的数据集合概念。数组在Java中被视为...

    JDK5.0新特性(3)——枚举

    在Java编程语言中,JDK 5.0的发布带来了一系列重要的新特性,极大地提升了开发效率和代码质量。其中,枚举(Enum)是引入的一个关键特性,它为表示固定集合中的常量提供了强大而安全的支持。这篇博客将深入探讨JDK ...

    JDK5.0 新特性

    在JDK 5.0中,Java引入了一系列重要的新特性,极大地提升了开发效率和代码的可读性。这些新特性包括自动包装和解包、增强的for循环、可变参数方法、printf风格的格式化输出、枚举类型以及静态导入等。 首先,自动...

    JDK5.0新特性 常量 、枚举、 for each、反射

    在Java开发领域,JDK 5.0是一个重要的里程碑,引入了多项显著的新特性,极大地提升了编程效率和代码质量。本文将深入探讨其中的四个关键特性:常量、枚举、for each循环(也称为增强型for循环)以及反射。 首先,让...

Global site tag (gtag.js) - Google Analytics