Java5678新特性.docx

上传人:b****3 文档编号:24886091 上传时间:2023-06-02 格式:DOCX 页数:12 大小:20.37KB
下载 相关 举报
Java5678新特性.docx_第1页
第1页 / 共12页
Java5678新特性.docx_第2页
第2页 / 共12页
Java5678新特性.docx_第3页
第3页 / 共12页
Java5678新特性.docx_第4页
第4页 / 共12页
Java5678新特性.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Java5678新特性.docx

《Java5678新特性.docx》由会员分享,可在线阅读,更多相关《Java5678新特性.docx(12页珍藏版)》请在冰豆网上搜索。

Java5678新特性.docx

Java5678新特性

Java5:

1.泛型 Generics:

引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处。

Parameterized Type作为参数和返回值,Generic是vararg、annotation、enumeration、collection的基石。

A、类型安全

抛弃List、Map,使用List、Map给它们添加元素或者使用Iterator遍历时,编译期就可以给你检查出类型错误

B、方法参数和返回值加上了Type

抛弃List、Map,使用List、Map

C、不需要类型转换

List list=new ArrayList();

String str=list.get(i);

D、类型通配符“?

假设一个打印List中元素的方法printList,我们希望任何类型T的List都可以被打印:

代码:

public void printList(List

> list,PrintStream out)throws IOException{

for(Iterator

> i=list.iterator();i.hasNext();){

System.out.println(i.next.toString());

}

}

如果通配符?

让我们的参数类型过于广泛,我们可以把List

>、Iterator

> 修改为

List

 Extends Number>、Iterator

 Extends Number>限制一下它。

2.枚举类型 Enumeration:

3.自动装箱拆箱(自动类型包装和解包)autoboxing & unboxing:

 简单的说是类型自动转换。

自动装包:

基本类型自动转为包装类(int ——Integer)

自动拆包:

包装类自动转为基本类型(Integer——int)

4.可变参数varargs(varargs number of arguments)

参数类型相同时,把重载函数合并到一起了。

如:

public void test(object... objs){

for(Object obj:

objs){

System.out.println(obj);

}

}

5.Annotations 它是java中的metadata

A、Tiger中预定义的三种标准annotation

a 、Override

指出某个method覆盖了superclass 的method当你要覆盖的方法名拼写错时编译不通过 

b、Deprecated

指出某个method或element类型的使用是被阻止的,子类将不能覆盖该方法

c、SupressWarnings

关闭class、method、field、variable 初始化的编译期警告,比如:

List没有使用 Generic,则@SuppressWarnings("unchecked")去掉编译期警告。

B、自定义annotation

public @interface Marked{}

C、meta-annotation

或者说annotation的annotation

四种标准的meta-annotation全部定义在java.lang.annotaion包中:

a, Target

指定所定义的annotation可以用在哪些程序单元上

如果Target没有指定,则表示该annotation可以使用在任意程序单元上

代码

   1. @Target({ElementType.ANNOTATION_TYPE,  

   2.          ElementType.CONSTRUCTOR,  

   3.          ElementType.FIELD,  

   4.          ElementType.LOCAL_VARIABLE,  

   5.          ElementType.METHOD,  

   6.          ElementType.PACKAGE,  

   7.          ElementType.PARAMETER,  

   8.          ElementType.TYPE})  

   9. public @interface TODO {}  

b, Retention

指出Java编译期如何对待annotation

annotation可以被编译期丢掉,或者保留在编译过的class文件中

在annotation被保留时,它也指定是否会在JVM加载class时读取该annotation

代码

   1. @Retention(RetentionPolicy.SOURCE)  // Annotation会被编译期丢弃  

   2. public @interface TODO1 {}  

   3. @Retention(RetentionPolicy.CLASS)   // Annotation保留在class文件中,但会被JVM忽略  

   4. public @interface TODO2 {}  

   5. @Retention(RetentionPolicy.RUNTIME) // Annotation保留在class文件中且会被JVM读取  

   6. public @interface TODO3 {}  

c, Documented

指出被定义的annotation被视为所熟悉的程序单元的公开API之一

被@Documented标注的annotation会在javadoc中显示,这在annotation对它标注的元素被客户端使用时有影响时起作用

d, Inherited

该meta-annotation应用于目标为class的annotation类型上,被此annotattion标注的class会自动继承父类的annotation

D, Annotation的反射

我们发现java.lang.Class有许多与Annotation的反射相关的方法,如getAnnotations、isAnnotationpresent

我们可以利用Annotation反射来做许多事情,比如自定义Annotation来做Model对象验证

代码

   1. @Retention(RetentionPolicy.RUNTIME)  

   2. @Target({ ElementType.FIELD, ElementType.METHOD })  

   3. public @interface RejectEmpty {  

   4.     /** hint title used in error message */  

   5.     String value() default "";  

   6. }  

   7.   

   8. @Retention(RetentionPolicy.RUNTIME)  

   9. @Target( { ElementType.FIELD, ElementType.METHOD })  

  10. public @interface AcceptInt {  

  11.     int min() default Integer.MIN_VALUE;  

  12.     int max() default Integer.MAX_VALUE;  

  13.     String hint() default "";  

  14. }  

使用@RejectEmpty和@AcceptInt标注我们的Model的field,然后利用反射来做Model验证

6.新的迭代语句(for(int n:

numbers))

7.静态导入(import static )

8.新的格式化方法(java.util.Formatter)

formatter.format("Remaining account balance:

 $%.2f", balance);

9.新的线程模型和并发库Thread Framework

HashMap的替代者ConcurrentHashMap和ArrayList的替代者CopyOnWriteArrayList

在大并发量读取时采用java.util.concurrent包里的一些类会让大家满意BlockingQueue、Callable、Executor、Semaphore...

 

Java6:

1.引入了一个支持脚本引擎的新框架

2.UI的增强

3.对WebService支持的增强(JAX-WS2.0和JAXB2.0)

4.一系列新的安全相关的增强

5.JDBC4.0

6.Compiler API

7.通用的Annotations支持

 

Java7:

1.switch中可以使用字串了

Strings="test"; 

switch(s){ 

case"test":

 

System.out.println("test"); 

case"test1":

 

System.out.println("test1"); 

break; 

default:

 

System.out.println("break"); 

break; 

}

2.泛型实例化类型自动推断

运用ListtempList=newArrayList<>();

3.语法上支持集合,而不一定是数组

finalListpiDigits=[1,2,3,4,5,8]; 

4.新增一些取环境信息的工具方法

FileSystem.getJavaIoTempDir()//IO临时文件夹

FileSystem.getJavaHomeDir()//JRE的安装目录

FileSystem.getUserHomeDir()//当前用户目录

FileSystem.getUserDir()//启动java进程时所在的目录5

 

5.Boolean类型反转,空指针安全,参与位运算

BooleanBooleans.negate(BooleanbooleanObj)

True=>False,False=>True,Null=>Null

booleanBooleans.and(boolean[]array)

booleanBooleans.or(boolean[]array)

booleanBooleans.xor(boolean[]array)

booleanBooleans.and(Boolean[]array)

booleanBooleans.or(Boolean[]array)

booleanBooleans.xor(Boolean[]array)

6.两个char间的equals

booleanCharacter.equalsIgnoreCase(charch1,charch2)

7.安全的加减乘除 

intMath.safeToInt(longvalue)

intMath.safeNegate(intvalue)

longMath.safeSubtract(longvalue1,intvalue2)

longMath.safeSubtract(longvalue1,longvalue2)

intMath.safeMultiply(intvalue1,intvalue2)

longMath.safeMultiply(longvalue1,intvalue2)

longMath.safeMultiply(longvalue1,longvalue2)

longMath.safeNegate(longvalue)

intMath.safeAdd(intvalue1,intvalue2)

longMath.safeAdd(longvalue1,intvalue2)

longMath.safeAdd(longvalue1,longvalue2)

intMath.safeSubtract(intvalue1,intvalue2)

8.map集合支持并发请求

且可以写成Mapmap={name:

"xxx",age:

18};

 

Java8:

10.接口的默认方法

interfaceFormula{

doublecalculate(inta);

defaultdoublesqrt(inta){//扩展方法

returnMath.sqrt(a);

}

}

 

11.Lambda表达式

Collections.sort(names,newComparator(){

@Override

publicintcompare(Stringa,Stringb){

returnpareTo(a);

}

});

Collections.sort(names,(Stringa,Stringb)->{

returnpareTo(a);

});

Collections.sort(names,(Stringa,Stringb)->pareTo(a));

Collections.sort(names,(a,b)->pareTo(a));

Collections.sort(names,String:

:

compareTo);

 

Lambda表达式由“参数列表”、“->符号”、“函数体”组成。

12.函数式接口

函数式接口是一个具有一个方法的普通接口,可以被隐式转换为lambda表达式。

如有某个人在接口定义中增加了另一个方法,这时,这个接口就不再是函数式的了,并且编译过程也会失败。

为了克服函数式接口的这种脆弱性并且能够明确声明接口作为函数式接口的意图,Java8增加了一种特殊的注解@FunctionalInterface。

 

13.方法引用

Therearefourkindsofmethodreferences:

Kind

Example

Referencetoastaticmethod

ContainingClass:

:

staticMethodName

Referencetoaninstancemethodofaparticularobject

containingObject:

:

instanceMethodName

Referencetoaninstancemethodofanarbitraryobjectofaparticulartype

ContainingType:

:

methodName

Referencetoaconstructor

ClassName:

:

new

4.1ReferencetoaConstructor

第一种方法引用是构造器引用,它的语法是Class:

:

new或Class:

:

new。

首先我们定义一个包含多个构造函数的简单类:

classPerson{

StringfirstName;

StringlastName;

Person(){}

Person(StringfirstName,StringlastName){

this.firstName=firstName;

this.lastName=lastName;

}

}

用来创建Person对象的对象工厂接口:

复制代码代码如下:

interfacePersonFactory{

Pcreate(StringfirstName,StringlastName);

}

PersonFactorypersonFactory=Person:

:

new;

Personperson=personFactory.create("Peter","Parker");

4.2ReferencetoaStaticMethod。

Themethodreference Person:

:

compareByAge isareferencetoastaticmethod.

publicclassPerson{publicenumSex{MALE,FEMALE}Stringname;LocalDatebirthday;Sexgender;StringemailAddress;publicintgetAge(){//...}publicCalendargetBirthday(){returnbirthday;}publicstaticintcompareByAge(Persona,Personb){returnpareTo(b.birthday);}

}

 

4.3ReferencetoanInstanceMethodofaParticularObject

ComparisonProvidermyComparisonProvider=newComparisonProvider();Arrays.sort(rosterAsArray,myComparisonProvider:

:

compareByName);

 

4.4ReferencetoanInstanceMethodofanArbitraryObjectofaParticularType

String[]stringArray={"Barbara","James","Mary","John","Patricia","Robert","Michael","Linda"};Arrays.sort(stringArray,String:

:

compareToIgnoreCase);

 

14.Lambda作用域

可以直接访问标记了final的外层局部变量,或者实例的字段以及静态变量。

Ø访问局部变量

Ø访问对象字段与静态变量

Ø访问接口的默认方法

15.DateAPI

 

16.Annotation注解

为了更好地帮助开发者提升代码的质量和可读性,以及自动化代码分析的准确性,Java8对Annotation引入了两项重要的改变:

TypeAnnotation和RepeatingAnnotation。

特性一:

TypeAnnotation

在Java8之前的版本中,只能允许在声明式前使用Annotation。

而在Java8版本中,Annotation可以被用在任何使用Type的地方,例如:

初始化对象时(new),对象类型转化时,使用implements表达式时,或者使用throws表达式时。

清单1.TypeAnnotation使用示例

//初始化对象时

StringmyString=new@NotNullString();

//对象类型转化时

myString=(@NonNullString)str;

//使用implements表达式时

classMyListimplements@ReadOnlyList<@ReadOnlyT>{

...

}

//使用throws表达式时

publicvoidvalidateValues()throws@CriticalValidationFailedException{

...

}

定义一个TypeAnnotation的方法与普通的Annotation类似,只需要指定Target为ElementType.TYPE_PARAMETER或者ElementType.TYPE_USE,或者同时指定这两个Target。

清单2.定义TypeAnnotation示例

@Target({ElementType.TYPE_PARAMETER,ElementType.TYPE_USE})

public@interfaceMyAnnotation{

}

特性二:

RepeatingAnnotation

之前版本的JDK并不允许开发者在同一个声明式前加注同样的Annotation,(即使属性值不同)这样的代码在编译过程中会提示错误。

而Java8解除了这一限制,开发者可以根据各自系统中的实际需求在所有可以使用Annotation的地方使用RepeatingAnnotation。

首先,在需要重复标注特性的Annotation前加上@Repeatable标签,示例如下:

@Repeatable(AccessContainer.class)

public@interfaceAccess{

Stringrole();

}

AccessContainer中必须定义返回数组类型的value方法。

数组中元素的类型必须为对应的RepeatingAnnotation类型。

具体示例如下:

public@interfaceAccessContainer{

Access[]value();

}

可以通过Java的反射机制获取注解的Annotation。

一种方式是通过AnnotatedElement接口的getAnnotationByType(Class)首先获得ContainerAnnotation,然后再通过ContainerAnnotation的value方法获得RepeatingAnnotation。

另一种方式是用过AnnotatedElement接口的getAnnotations(Class)方法一次性返回RepeatingAnnotation。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1