Hi java

java新特性

1995.5.23 java语言

1996 jdk1.0 250个类在API 主要用在桌面型应用程序
1997 jdk1.1 500 图形用户界面编程
1998 jdk1.2 2300 J2SE J2EE J2ME
2000 jdk1.3/1.4
2004 jdk1.5 3500 Teger语言
2005 jdk1.6
2011 jdk1.7

java5新特性
自动装箱/拆箱
增强的for循环
类型安全枚举
可变长参数
静态导入
格式化输出
泛型
Annotation注解

一、Autoboxing/Unboxing
-------------------------------
1.什么试装箱和拆箱?
装箱操作:将基本数据类型转换为它所对应的包装器类
拆箱操作:将包装器类转换为对应的基本数据类型

包装器类:位于java.lang包下

8种基本数据类型 对应的包装器类
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
boolean Boolean

包装器类分为两类:
1.Number的子类:
Byte Short Integer Long Charater Float Double
2.其他类型:
Character Boolean

Number类:
intValue() doubleValue() ...
*Value()用于返回该应用类型所代表的基本数据类型

2. 如何进行装箱和拆箱操作?
Int a=10; Integer b=null;
b=new Integer(a); //手动装箱
a=b.intValue(); //手动拆箱

Boolean flag=true;//自动装箱
boolean flag1=flag;//自动拆箱

自动装箱/拆箱操作大大简化了基本数据类型和应用类型的使用

Integer i1=100;
Integer i2=100;
if(i1==i2){
System.out.println("i1==i2");
}else{System.out.println("i1!=i2");}

存在的问题:
自动拆箱:调用*Value()方法,和手动拆箱相同
自动装箱:不是通过new的方法进行,通过调用valueof()方法
缓存池
Integer -127 ~128
Short -127 ~128
Long -127 ~128
Byte 全部缓存
Boolean 全部缓存
Float 都不缓存
Double 都不缓存
Charater 只缓存ASCII/Unicode编码<127的字符

Enhanced for loop
-----------------------
语法:
for(type element:arr){
System.out.println(element);
}

type:类型,所要遍历的数组或集合里的数据类型
element:元素,遍历是的临时变量
arr:所要遍历的数组或集合的应用

集合必须实现了Iterable接口
Collection

ctrl+shift+o
alt+/ 提示

弊端:
1)增强的for循环本身无法明确的指向元素所在的索引位置
2)需要强制类型转换

三、 Type-safe enumeration 枚举类型
---------------------------------------
引入类型枚举可以控制源程序的非法值,只能是若干固定值的一个,如果超出这个范围,编译器在编译时报错。

public class Gender{
private String name;
private static final MALE=new Gender("男");
private static final FEMALE=new Gender("女");

private Gender(String name){
this.name=name;
}
public static Gender getInstance(int i){
switch(i){
case 0:return MALE;
case 0:return FEMALE;
default:return null;
}
}
}
Gender g1=new Gender("男");
Gender g2=new Gender("女");

枚举类型的定义:
public enum Gender{
MALE,FEMALE;
}
其中每一个枚举元素都是该枚举类型的一个实例

枚举的使用:
Gender male=Gender.MALE;
Gender female=Gender.FEMALE;

枚举的遍历
每个枚举类型默认都提供了两个静态方法values()和valueOf()
for(Gender g:Gender.values()){}
values()方法返回的是一个包含该枚举类型当中所有枚举元素的数组
valueOf(String name)可以通过枚举元素拿到该枚举类型的一个实例

Enum和enum的区别
1)每一个使用enum关键字定义的枚举类型默认都继承于java.lang.Enum类
2)枚举类当中的枚举元素都是该枚举类的实例,默认为public static final修饰的

Enum类只有一个受保护的构造方法
protected Enum(String name,int ordinal){}
name 代表枚举元素的名称
ordinal代表枚举元素的编号,编号从0开始,按照声明顺序进行编号
name() 获取该枚举元素的名称
ordinal() 获取该枚举元素在列表中的编号

枚举类型的属性和方法
枚举类中可以定义属性和方法
规则:必须定义在枚举元素声明之后

枚举类型的构造方法
1)构造方法必须定义在元素声明之后
2)构造方法只能是private的,不写默认也是private的
3)元素如果要调用有参构造方法,可以在元素之后加上“(参数)”

枚举继承
枚举类型默认继承java.lang.Enum类,所以无法再继承其他类。

枚举实现接口
有两种方法
1)和普通class 类一样,在枚举类中实现接口
2)每一个枚举元素分别实现这个接口

枚举中的抽象方法
枚举类型中可以定义一个活多个抽象方法,但是每一个枚举元素必须分别实现这些抽象方法

switch对枚举的支持
switch(byte)
switch(int)
switch(short)
switch(char)
switch(枚举类型)

类集对枚举的支持
java.util包下
EnumMap
实现了Map接口,基本操作和Map相同
调用构造方法是,需要指定键值的枚举类型
EnumSet
是想了Set接口
构造方法私有化
其中所有方法都是静态方法,可以通过allOf/of...方法来实例化EnumSet

四、Variable Arguments可变长参数
------------------------------------
可变长参数使得我们尅声明一个可接收可变数目参数的方法
public int sum(int a,int b){
return a+b;
}
public int sum(int a,int b,int c){
return a+b+c;
}

public int sum(int[] a){
//对数组进行遍历相加
//必须先声明一个数组
}
int[] a=new int[]{1,2,3,4};
sum(a);
------------------------
public int sum(int...param){
//可变参数在处理的时候按照数组的方式进行处理
//不需要声明数组
//直接引用
}
sum(1,2);
sum(2,3,4);

在使用可变参数后,在调用方法是可以依据类型传入一个或多个该类型的参数或传入一个该类型的数组参数

使用条件:
//1)如果参数列表中有数组参数,不能再使用可变参数,两者不能够共存
2)在一个方法中最多只能定义一个可变参数,并且必须位于参数列表的最后

五、static import 静态导入
-----------------------------------
jdk1.5之前,要使用某个类的静态成员,必须给出提供该静态成员的类
jdk1.5引入静态导入:可以使被导入类的静态成员在当前类中直接可见,不需要再提供类名

import static ......

过度使用会在一定程度上降低代码的可读性。

六、格式化输出(printf)
-----------------------------------
java 中printf的语法比C语言中的要严格的多
java的格式输出有java.util.Formatter支持

Formatter
print风格的格式化字符串的解释程序
主要方法:
format(String format,Object...rgs){}
第一个参数:包含格式化说明符的格式化字符串
第二个参数:与格式化说明符对应的可变参数
eg:
format("this is %1$s,%d","test",100);

格式化说明符的语法:
%[argument_index$][flags][width][.precision]conversion
argument_index:代表参数在参数列表中的位置
flags:标志位,用于表示输出格式 例如,“-”表示以左对齐方式输出
width:表示参数所占用的宽度
precision:表示整数位数或小数的浮点数
conversion:具体的格式化字符

日期格式化说明符语法:
%[argument_index$][flags][width]conversion
conversion:t/TY tM

String类和PrintStream类也支持格式化输出
String类增加了静态方法format(String format,Object...args)
PrintStream类增加了printf(String format,Object...args)

七、Generic 泛型
------------------------------------
泛型的本质是参数化类型,也就是说我们所操作的数据类型可以被指定为一个参数,该参数可以用在类、接口和方法的创建中分别称为泛型类、泛型接口和泛型方法。

意义:
jdk1.5之前,为了是类具有通用性,通常使用Object去代替其他类型。
使用Object的缺陷:
1)需要进行强制类型转换;
2)容易出现ClassCastException
通过引入泛型,可以保证编译时类型的安全和运行时更小的抛出ClassCastException异常的可能。

定义:
泛型类:在声明类的时候,指定泛型类型参数
public class Test<T>{
private T foo;
}
‎ 类型参数T可以是任意合法的标识符
一般约定:
T type
E element
K key
V value

术语:
ArrayList<E>
ArrayList称为该泛型类的原始类型
E为类型参数
<>读作typeof
ArrayList<E>称为ArrayList的泛型类型/参数类型

使用:
在实例化泛型类时,只能传入具体的类类型,不能是基本数据类型。
泛型类中的属性类型可以根据传入的参数类型确定
不指定参数类型时,默认该类中的属性为Object

限制泛型的使用类别
当实例化泛型类时,预设可以使用任意类型去实例化泛型类型中的参数类型,但是如果要限制使用泛型类型时,只能是某个特定类型或其子类才能实例化该泛型类型,这时才可以使用extends关键字指定该参数类型是实现了某个接口或继承于某个类

class Generic<T extends Number>{}
Generic<String> g=new Generic<String>();//program is fauls

class Generic<T extends Collection>{}

如果没有使用extends关键字指定类型是,默认是<T extends Object>

泛型通配声明
泛型通配符 ?
Generic<String> foo=null;
Generic<Integer> foo1=null;
foo=new Generic<String>();
foo1=new Generic<Integer>();

//声明
Generic<?> foo=null;
foo=new Generic<String>();
foo=new Generic<Integer>();

? 可以匹配任意的类型
? extends 类型 表示该类型为某个特定的子类
? super 类型 表示该类型为某个特定类型的父类

使用<?>或<? extends someClass>声明的引用,只能去获取指定对象的值或清空其值,而不能给他进行赋值操作

SimpleCollection
int[] t;
int index;

add()
int getLength();
get(int i);

泛型继承类别
public lass Chid<T> extends Parent<t>{}
子类的类型声明必须和父类的一致

public class Child extends Parent<String>{}
public class Child<T> extends Parent<String>{}

泛型接口
使用和泛型类相同
语法定义:
ingerface interName<类型参数,类型参数>{}
eg:
public interface Test<T>{
public abstract void fun(T t);
public abstract T fun1();
}

泛型方法:
泛型方法的类型参数必须声明之后再能使用
1)在泛型类中,由于类型参数声明过,直接使用
2)在非泛型类中,需要在返回值前先声明类型参数才能使用

八、Annotation
---------------------------------------------------
jdk1.5引入Annotation,Annotation提供一些原来不属于源程序的数据,实际上表示的是一种注释语法,一种标记。
根据所起的作用分为两类:
编译检查:仅作为一个标记给编译器一些信息,让编译器在编译的时候做一些特殊的处理。
代码处理:运行时通过反射可以获取annotation的信息并执行相应的操作

(一)系统内建的Annotation
jdk1.5以后内建了三个annotation,他们都是用来做编译检查的
位于java.lang包下的annotation
1)@Override
表示重写/覆盖操作,强制保证@Override所标识的方法确实是覆盖了父类中的同名方法。
2)@Deprecated
表示过时的,不建议使用的操作
用法:
a.定义了一个类,不建议使用它
b.在父类中定义了一个Deprecated的方法,子类重写时,编译器会发出警告。
3)@SuppressWarnings
表示抑制/压制警告,不让编译器发出警告,可以同时抑制多个警告
@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
unchecked:表示未经检查的操作
deprecation:表示过时的操作
rawtypes:表示泛型
all:所有

@Override @Deprecated 是Marker Annotation, 即名称本身给编译器提供信息
@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })

(二)自定义Annotation的定义和使用
自定义Annotation一般都是用来做代码处理的
语法定义:
@Interface annotationName{
}
public @Interface Override{
}
自定义的Annotation,本质上自动继承了java.lang.annotation.Annotation接口

Annotation与接口的异同:
1.Annotation是一个接口
1)变量和接口中的变量相同,只能是public static final的
2)方法和接口中一样,只能是public abstract的
2.Annotation是一个特殊的接口
1)annotation中的方法必须没有参数,不能抛出异常,必须有返回值,返回值类型有限制
2)可以给方法的返回值设定默认值
3)annotation中的方法称之为属性
4)使用的时候使用标记的形式使用 eg: @MyAnnotation
5)根据保留时间的不同执行不同的操作(高级特性)

Annotation的属性
语法:
type arrName()[default value];

type类型可以是:
基本数据类型
String类型
Class类类型
枚举类型
Annotation类型
以及它们的一维数组形式

Annotation的使用
1.如果属性没有指定的默认值,使用是必须给属性赋值
2.如果只有一个属性且属性名称为value是,在使用时可以不指定属性名称。
3.除了value属性其他属性都有默认值时,在使用时也可以不指定属性名称。

(三)高级特性---元注解
元注解:用来标识注解的注解
[email protected]
用来指定annotation的保留范围,其取值有java.lang.annotation.RetentonPolicy提供

public enum RetentionPolicy{
SOURCE,//只保留在java源文件中
CLASS, //保留在class文件中,不会被JVM读取,默认
RUNTIME //保留在运行时(保留在class文件中,运行时被JVM读取)
}

@Retention(RetentionPolicy.CLASS)
public @interface myAnnotation{
}

一个自定义的annotation要想起作用,可以通过反射机制在运行时获取相应的信息。
java.lang.reflect.AnnotatedElement
//用来判断指定元素上是否有指定类型的annotation存在
public abstract boolean isAnnotationPresent(Class AnnotationType)
public abstract Annotation getAnnotation(Class annotationType)
public abstract Annotation[] getAnnotations()

[email protected]
用来指定annotation的使用范围,其取值有java.lang.annotation.ElementType提供

public @interface Target{
ElementType[] value();
}

@Target({ElementType.METHOD,ElementType.FIELD})
public @interface myAnnotation{
}

public enum ElementType{
ANNOTATION_TYPE,//annotation类声明上
CONSTRUCTOR, //构造器上
FIELD, //实例变量上
LOCAL_VARIABLE, //局部变量上
METHOD, //方法声明上
PACKAGE, //包声明上
PARAMETER, //参数声明上
TYPE //类,接口和枚举类型的声明上
}
对于PACKAGE的使用,必须是在package-info.java文件中使用

[email protected]
使用@Documented所标记的annotation,在生成javadoc文档时会将annotation信息加入。

@Documented
public @interface myAnnotation{
}

[email protected]
表示一个annotation是否会被使用该annotation的类的子类继承

时间: 2024-08-02 13:23:24

Hi java的相关文章

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

由@NotNull 注解引出的关于Java空指针的控制(转)

Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键.“预防好过治疗”这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的代码.作为

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

Java自学序言

Java自学序言 亲爱的自己和各位读者朋友: 您们好! 这是作者本人自学Java编程开发的一系列文章,不具有一定的权威性,也算是自己一个人的学习笔记和总结,希望自己通过博客的形式将我自己的学习效率得到提高.如自学的稳重存在不足或错误的地方希望广大的博客朋友们多多指教.本人在此不胜感激! 学习Java是一件很痛苦的事儿,我自己要想不断的去挑战一下自己,把自己大学所学的Java知识能够巩固起来.不断的去改正自己开发中的不足之处.如何来学习Java?如何来更好的掌握Java开发语言?这些都是我们要不断

接口测试(java+testng+ant+jenkins)第五篇 java二

1.数据代码分离,方便维护. 一般做法是将数据保存在excel,通过程序读取. 2.读取excel数据. 在D盘新建excel,A列放url,B列放参数. 新建class redExcel package com.lx; import java.io.File; import java.io.IOException; import jxl.*; import jxl.read.biff.BiffException; public class redExcel{ public static voi