黑马程序员-----高新技术(Eclipse使用技巧和JDK1.5新特性)

------- android培训、java培训、期待与您交流! ----------

Eclipse使用技巧:

eclipse是一种IDE(集成开发环境)开发工具,IDE全称:itegrity  development  environment

Eclipsejavacjava的配置:Window-------Preferences-------Java------Complier(编译时的设置)和Installed JREs(运行时的设置)


工程建立常用4步骤:

1、新建工作间:File-------Switch Workspace

2、新建工程:File-------New-----Project-----New Project-----Java Project(点下一步)------New Java Project(输入工程名称)-------finish

3、新建class:工程名称下src(点右键)-----New-----Class-----New Java Class(设置包名和类名)------finish

4、快捷键配置:Window-------Preferences------General-----Keys(如内容助理设置:先找到Content Assist,按Removing Binding解除绑定,然后在Name下的Binding处按想要绑定的键,最后按Apply即可,Ok结束)。


Eclipse下调试变量:在需要查看的语句前面的竖直栏上双击即可插入断点(取消再次双击即可),通过插入两个断点来需要查看的范围,点击右键Debug As运行进行查看,然后选中变量点击右键Watch即可查看变量值的变化。

调用视图小窗口:Window------Show View


JDK1.5新特性:

可变参数:即传入的参数个数可以根据需求进行变化;

可变参数的特点:

      1、只能出现在参数列表的最后面;

      2、...位于变量类型和变量名之间,前后有无空格都可以; 

      3、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

如下实例:

public class VarableParameter {
	public static void main(String[] args) {//主函数
		System.out.println(add(4,5,2));//可变参数的调用
		System.out.println(add(4,5,2,4));//可变参数的调用	
	}
	public static int add(int x,int...ags){//可变参数函数
		int sum=x;
		for(int i=0;i<ags.length;i++){
			sum+=ags[i];
		}
		return sum;
	}
}

自动拆装箱:可以理解为基本数据类型和对象之间的自动转换,如Integer i=10,10会自动装箱提升为一个new Integer(10)的实例对象,在如Integer i=new Integer(10),int t=i+5;new Integer(10)实例对象会自动拆箱成基本数据类型10,从而与5进行相加计算

但还有一点需注意:如Integer a=127;Integer b=127;这里a==b的,因为当数值在byte范围内时,对于新特性,如果该数值已经存在,则不会再开辟新的空间;Integer的自动装箱范围为一个字节-128127。

说到自动拆装箱就不得不说一种设计模式:

享元模式(flyweight):有很多个小的对象,他们有很多属性相同,把这些相同的属性变成一个对象,则这些相同的属性称之为这个对象的内部状态;把那些不同的属性变成方法的参数,则这些不同的属性称之为这个对象的外部状态。


高级for循环,格式:for(数据类型 变量名:被遍历的集合(Collection)或者数组){};对集合进行遍历只能获取集合元素,但是不能对集合进行操作;迭代器除了遍历,还可以进行remove集合中元素的动作,如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作


枚举:枚举将相对于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法;

枚举元素必须位于枚举体中最开始部分,枚举元素的后面要有分号与其他成员隔开,如果把枚举中的成员变量或方法等放在枚举元素的前面,编译器会报告错误。

带构造函数的枚举:

1、构造方法必须定义成私有;

2、如果有多个构造方法,可以在元素的后面加参数进行选择使用,如MON(1)SUNMON()SUN调用的都是空参数构造函数;

枚举如果只有一个成员时,就可以作为一种单例的实现方式。

枚举实例如下:

public class EnumTest {
	public static void main(String[] args) {
		WeekDay weekDay2=WeekDay.MON;
		System.out.println(weekDay2);
		System.out.println(weekDay2.ordinal());
		TrafficLamp traffic=TrafficLamp.GREEN;
		System.out.println(traffic);
		System.out.println(traffic.nextLamp());
	}
	public enum WeekDay{//枚举		
		SUN(1),MON,TUE,THI,FRI,SAT;//枚举元素
		private WeekDay(){System.out.println("first");}//枚举无参构造函数
		private WeekDay(int day){System.out.println("second");}//枚举有参构造函数
	}
	public enum TrafficLamp{//枚举
		RED(30){
			public TrafficLamp nextLamp(){//枚举子类对象实现抽象方法
				return GREEN;
			}	
		},
		GREEN(45){
			public TrafficLamp nextLamp(){
				return YELLOW;
			}		
		},
		YELLOW(5){
			public TrafficLamp nextLamp(){
				return RED;
			}	
		};
		public abstract TrafficLamp nextLamp();//枚举抽象方法
		private int time;
		private TrafficLamp(int time){//枚举有参数构造函数
			this.time=time;
		}
	}
}


泛型:用于限定集合所存在的对象

泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器源程序的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可。

泛型格式:通过< >来定义要操作的引用数据类型,如ArrayList<String> al=new ArrayList<String>();

泛型涉及到的术语:

1、ArrayList<E>整个称为ArrayList<E>泛型类型;

2、ArrayList<Integer>称为参数化的类型;

3、ArrayList<E>中的E称为类型变量或类型参数;

4、ArrayList<Integer>Integer称为类型参数的实例或实际类型参数;

5、ArrayList<Integer>中的< >念着typeof,即ArrayList typeof Integer

6、ArrayList称为原始类型。


参数化类型与原始类型的兼容性:

1、参数化类型可以引用一个原始类型的对象,编译报告警告,例如:Collection<String> c=new Vector()

2、原始类型可以引用一个参数化类型的对象,编译报告警告,例如:Collection c=new Vector<String>()

3、参数化类型不考虑类型参数的继承关系,如Vector<String> v=new Vector<Object>();此种写法错误;再如:Vector<Object> v=new Vector<String>();此种写法也错误。

4、在创建数组实例时,数组的元素不能使用参数化的类型,例如:Vector<Integer> vectorList[]=new Vector<Integer>[10]


在使用java提供的对象时,什么时候写泛型呢?

    通常在集合框架中很常见,只要见到< >就要定义泛型,其实< >就是用来接收类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到< >中即可。

什么时候定义泛型类?

    当类中要操作的引用数据类型不确定的时候,早期定义Object来完成拓展,现在定义泛型来完成扩展。

泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有操作的类型就已经固定了;为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上。

特殊之处:静态方法不可以访问类上定义的泛型;如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。

?通配符,也可以理解为占位符;

泛型的限定:? extends E,可以接收E类型或者E的子类型,上限;? Super E,可以接收E类型或者E的父类型。

定义泛型方法:

1、用于放置泛型的类型参数的尖括号应出现在方法的其他所有修饰符之后和在方法的返回类型之前,也就是紧邻返回值之前,按照惯例,类型参数通常用单个大写字母表示。

2、只有引用类型才能作为泛型方法的实际参数;

3、除了在应用泛型时可以使用extends限定符,在定义泛型时也可以使用extends限定符,例如:Class.getAnnotation()方法的定义,并且可以用&来指定多个边界,如<V extends Serializeble & cloneble> void method(){}

4、普通方法、构造方法和静态方法中都可以使用泛型,编译器也不允许创建类型变量的数组;

5、也可以用类型变量表示异常,称为参数化异常,可以用于方法的throws列表中,但是不能用于catch句子中;

6、在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号分开,例如:public static <K,V> ge){  return map.get(key); }


注解:注解相当于一种标记,加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,javac编译器、开发工具和其它程序可以用反射来了解你的类和各种元素上有无何种标记,看你有什么标记,就去干相应的事;标记可以加在包、类、字段、方法、方法的参数以及局部变量上,如几个基本标记:@Deprecated@Override@SuppressWarning3种标记意思分别为过期、重写、警告。

1、注解的定义:如public @inteface MyAnnotation{}

2、元注解@Retention,其三种取值RetetionPolicy.SOURCERetetionPolicy.CLASSRetetionPolicy.RUNTIME,分别对应所在的三种状态:java源文件----->class文件------>内存中的字节码

注解添加属性:

1、为属性指定缺省值,如String color() default “blue”;这样在调用注解时,此属性可以不用再赋值(也可以重新赋值)。

2、注解如有多个属性,有的属性已经指定了缺省值,则在调用时可以不在赋值,但没有指定缺省值的必须赋值,否则会报错。

3、数组类型的属性,如int[] arrayAttr(),调用注解时则写成,如@MyAnnotation(arrayAttr={1,2,3}),如果数组属性中只有一个元素,这时属性值部分可以省略大括号。

4、枚举类属性:如 EnumTest.TrafficLamp lamp();EnumTest .TrafficLamp为一个枚举类,在调用注解时可以写成,如@MyAnnotation(lamp=EnumTest.TrafficLamp.RED).

5、注解类型的属性,请参考以下示例。

备注:注解的详细语法可以通过看java语言规范了解,即看javalanguagespecification

综合示例:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import cn.itcast.day1.EnumTest;

public @interface MetaAnnotation {//定义注解,此注解用于给注解添加注解属性示例
	String value();//给注解添加属性
}

@Retention(RetentionPolicy.RUNTIME)//元注解,此意思为保留在运行阶段
@Target({ElementType.METHOD,ElementType.TYPE})//标记注解只能定义在方法和类上
public @interface ItcastAnnotation {//定义注解
	String color() default "blue";//给注解添加属性,default意味给color添加缺省值
	String value();//给注解添加属性
	int[] arrayAttr() default{3,4,5};//给注解添加数组型属性
	EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;//给注解添加枚举类属性
	MetaAnnotation annotationAttr() default @MetaAnnotation(value="aaa");//给注解添加注解型属性
}


@ItcastAnnotation(color="red",value="abc",arrayAttr={1,3,5},
		annotationAttr=@MetaAnnotation(value="sss"))//注意此处数组类型属性怎么赋值
public class AnnotationTest {//定义一个类,用于测试注解
	@SuppressWarnings("deprecation")//压缩警告注解
	@ItcastAnnotation("123")//如果有一个属性已经指定缺省值,在此可以不必再赋值
	public static void main(String[] args)throws Exception {
		if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){//用反射调注解
			ItcastAnnotation annotation=AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
			System.out.println(annotation);
		}
	}

}

你可能感兴趣的:(注解,泛型,开发工具,jdk1.5新特性,Eclipses使用技巧)