黑马程序员_JDK1.5新特性

 
 
------------ android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
JDK5.0新特性

	自动装箱/拆箱
		自动装箱:指可以将基本数据类型直接付给对应的包装类
		自动拆箱:指包装类对象直接赋给对应的基本数据类型
		另:num值小于128的两个Integer引用相等(享元设计模式)
			复用内存中已存在的对象,降低系统创建对象实例的性能消耗
	增强for循环
		for(变量类型 变量 :需迭代的数组或集合){}
		范围:数组或实现iterable接口的集合类上
		另:只适合获取数据,不能进行其它操作
	静态导入
		import static 包名.类名.静态属性|静态方法|*
		用于简化程序对类静态属性和方法的调用
		例如:import static java.lang.Math.*;
	可变参数
		即允许为方法定义长度可变的参数,操作时为便于理解,可直接把参数当数组看待
		例: public void foo(int... args){}
		注意:1、调用可变参数的方法时,编译器将自动创建一个数组保存传递给方法的可变参数
		      因此,方法体重可以以数组的形式访问可变参数
			  2、可变参数只能用于参数列表的最后,另一个方法最多只能由一个可变的参数
			  3、当数组装的是基本数据类型,可变参数的类型是引用类型,则直接把数组当做参数
	枚举
		特殊类,enum关键字用于定义枚举类,枚举类中的枚举值代表该类中的一个实例对象
		应用:一些程序运行其需要的数据不能是任意的,而必须是一定范围内的值,则可用枚举类解决
		另:1、枚举类中与普通类一样,可以定义构造函数(必须私有)、字段以及方法
			2、switch语句,除接收int、byte、char、short外还可接受枚举类型
			3、枚举类只有一个枚举值,则可以当做单例设计模式使用
			4、调用name方法,可以获取常量名称;values()返回枚举类中所有枚举值
	
/*  演示:定义一个weekday的普通类来模拟枚举功能
 *  1、星期几固定有7个值,每个值的下一个值也是固定的
 *  2、私有的构造方法
 *  3、每个元素分别用一个公有的静态成员变量表示
 *  4、可以有若干公有方法或抽象方法,例如nexdDay方法
 * */
package cn.ithema.day1;
public abstract class WeekDay1 {
	//将构造函数私有
	private WeekDay1(){}
	//指定全局变量,该变量值为对象
	//采用抽象方法定义nextDay就将大量的if语句转移成了一个个独立的类
	public final static WeekDay1 SUN = new WeekDay1(){
		public WeekDay1 nextDay() {
			return MON;
		}
	};
	public final static WeekDay1 MON = new WeekDay1(){
		public WeekDay1 nextDay() {
			return TUE;
		}
	};
	public final static WeekDay1 TUE = new WeekDay1(){
		public WeekDay1 nextDay() {
			return WED;
		}
	};
	public final static WeekDay1 WED = new WeekDay1(){
		public WeekDay1 nextDay() {
			return THU;
		}};
	public final static WeekDay1 THU = new WeekDay1(){
		public WeekDay1 nextDay() {
			return FRI;
		}};
	public final static WeekDay1 FRI = new WeekDay1(){
		public WeekDay1 nextDay() {
			return SAT;
		}};
	public final static WeekDay1 SAT = new WeekDay1(){
		public WeekDay1 nextDay() {
			return SUN;
		}};
	//类中下一天的抽象方法
	public abstract WeekDay1 nextDay();
/*定义一个交通灯枚举类,该类带有抽象方法nextTemp()
	 * 1、元素为RED GREEN YELLOW
	 * 2、抽象方法nextTemp()
	 * 3、交通灯时间
	 * */
	package cn.ithema.day1;
	public enum TrafficLamp{
		//元素列表必须位于类的开头,用;表示结束
		RED (30){
			public TrafficLamp nextLamp() {
				return GREEN;
			}
		},
		GREEN (45){
			public TrafficLamp nextLamp() {
				return YELLOW;
			}
		},
		YELLOW (5){
			public TrafficLamp nextLamp() {
				return RED;
			}
		};
		
		private int time;
		/*枚举类的构造方法演示,必须是私有的,因为枚举类就是为了使得程序所需数据是固定范围的,
		所以枚举类提供的成员以涵盖所有可能,不用在new对象了,从而构造函数就需私有*/		
		private TrafficLamp(int time){ this.time = time;} 
		//枚举类中定义抽象方法
		public abstract TrafficLamp nextLamp();
	}

注解  public interface Annotation
注解可以理解为一种标记,在程序中某个成员加了某注解就等于为程序加上了某种标记,
   编译器、开发工具和其他程序都可通过反射来判断该成员是否有无某种标记。
注解可作用于包、类、方法、方法参数以及局部变量上
作用
1、编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
2、代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
3、编译检查:通过代码里标识的元数据让编译器能过实现基本的编译检查【Override】
java.lang包中的三种注解
Deprecated     表示该注释元素是过时的
Override   表示该注释方法是覆盖超类的方法
SuppressWarnings  表示忽略注释元素指定的编译器警告
自定义注解
1、元注解——注解的注解
@Rentention  指示自定义注解保留期间(SOURCE、CLASS、RUNTIME)
@Target 指示注解类型适用的程序元素的种类(FIELD、METHOD、PACKAGE、TYPE...)
2、添加属性
简单属性:字符串、int、数组等
高级属性:枚举、注解等
Type类型
类、接口(包括注释类型)、枚举声明,都是一种Type类型

//自定义注解演示
package cn.ithema.day2;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import cn.ithema.day1.EnumTest;

//给注解定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IthemaAnnotation {
	//default "..."为缺省值即默认复制,抽象方法前省略了public abstract
	String color() default "blue";
	//
	String value();
	//添加数组属性
	int[] arrayAttr() default {3,4,5};
	//添加枚举属性
	EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED; 
	//添加注解属性,如果属性只有value,则在引用注解时可省略(value=),直接赋值即可
	MetaAnnotation annotationAttr() default @MetaAnnotation("ywy");
}

@interface MetaAnnotation {
	String value();
}
package cn.ithema.day2;
//自定义注解作用在类上,"XYZ"前省略了value=
@IthemaAnnotation("XYZ")
public class AnnotationTest {
	//一个@注解相当于一个类,此处相当于创建了类的一个实例对象
	@SuppressWarnings("deprecation")  
	public static void main(String[] args) {
		System.runFinalizersOnExit(true);
		
		//检查某个类是否有某个注解
		if(AnnotationTest.class.isAnnotationPresent(IthemaAnnotation.class)){
			IthemaAnnotation annotation = AnnotationTest.class.getAnnotation(IthemaAnnotation.class);
			System.out.println(annotation.color());
			System.out.println(annotation.value());
			System.out.println(annotation.arrayAttr().length);
			//注解的属性值为枚举,获取该枚举实例的方法返回的实例
			System.out.println(annotation.lamp().nextLamp());
			//注解的属性值为一个注解,在获取该注解的属性值
			System.out.println(annotation.annotationAttr().value());	
		}		
	}
}

泛型
作用:规定原始类型操作范围,将错误显示在编译时期,而且避免了强转。
泛型术语
示例:ArrayList<E>和ArrayList<Integer>
1、ArrayList           RawType 原始类型
2、ArrayList<E>        泛型类型
3、ArrayList<Integer>  参数化类型,ParameterType类表示
4、E                   类型变量
5、Integer             ActualTypeArgument实际类型参数
6、<>                  读作typeof
注意事项
1、使用泛型时,泛型类型为引用类型不能是基本数据类型
2、如果两边都有泛型则两边必须一致
3、泛型是提供给javac编译器使用的,它用于限定集合的输入类型,编译器挡住向集合中插入非法数据。
  但编译器编译完带有泛型的java程序后,生产的clss文件中将不再带有泛型信息
      因此使程序运行效率不受到影响,这个过程称之为“拆除”
4、一个类加不同泛型,其字节码是相等的
5、不能通过参数获取其泛型类型,但可以通过方法得知其参数类型

package cn.ithema.day2;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
public class GenericTest {

	public static void main(String[] args)throws Exception {
		/*无泛型,集合中添加不一致的类型数据,编译器不会报错
		ArrayList collection1 = new ArrayList();
		collection1.add(1);
		collection1.add(1L);
		collection1.add("abc");*/
		
		ArrayList<String> collection2 = new ArrayList<String>();
		//collection2.add(1);
		//collection2.add(1L);
		collection2.add("abc");
		
		//验证加不同泛型的同一类的字节码是一样的
		ArrayList<Integer> collection3 = new ArrayList<Integer>();
		System.out.println(collection3.getClass()==collection2.getClass());
	
		//编译器会去泛型,通过反射得到字节码无泛型,便可加入指定类型参数
		//collection3.add("ywy");
		collection3.getClass().getMethod("add",Object.class).invoke(collection3,"ywy");
		System.out.println(collection3.get(0));
		
		//通过反射获得泛型的实际类型参数
		Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);
		Type[] types = applyMethod.getGenericParameterTypes();
		ParameterizedType pType = (ParameterizedType)types[0];
		//获取原始类型和实际类型参数
		System.out.println(pType.getRawType());
		System.out.println(pType.getActualTypeArguments()[0]);
		
	}
	//不能通过参数v1获得其泛型类型,但是可以通过applyVector方法获得参数类表类型
	public static void applyVector(Vector<Date> v1){
	}
}



------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.csdn.net/heima/




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值