JDK1.5新特性
1.静态导入 import static
一般导入和静态导入的区别:
import语句可以导入一个类或某个包中的的所有类
import static语句可以导入一个类中的某个静态方法或所有的静态方法
2.可变参数
特点:
1.只能出现在参数列表的最后
2. ... 位于变量类型和变量名之间,前后有无空格都可以
3.调用可变参数的方法是,编译器为该可变参数隐式创建一个数组,在方法体中义数组的形式访问可变参数
3.增强for循环
语法:
for(变量类型 变量名:集合(数组)名){}
注意:
迭代变量必须定义在()中定义
集合变量可以是数组或实现了Iterator接口的集合类
4.自动装箱与拆箱
自动装箱:基本数据类型自动提升为基本数据类型对象的过程
自动拆箱:基本数据类型对象自动转换为基本数据类型的过程
注意:Integer对象的值在-128~127之间时,两个相等的对象比较结果是true,如果超过了这个范围,结果就是false
享元模式(flyWeight),在一定的数据范围内共享一个的对象(频繁使用的,并且数值较小的)。
5.枚举
为什么要有枚举?
枚举就是要让某个类型的变量的取值只能为若干个固定值的一个,否则,编译报错。
枚举可以让编译器在编译时,就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现。
用普通类如何实现枚举功能,定义一个weekday的类来模拟枚举功能
私有构造函数
每个元素分别用一个公有的静态成员变量表示
可以有若干个功能公有方法或抽象方法。
采用抽象方法定义,将大量的判断性代码转移成了一个个独立的类(内部类)。
构造方法
位于元素列表之后,最后一个元素要加 ;
构造方法要用private修饰
调用枚举成员时,会调用默认无参构造,即默认格式是SUN()。
要想调用带参构造的时候,元素后加(1),例如 SUN(1)
带抽象方法
枚举的每个元素分别由枚举类的子类来生成的实例对象,实现抽象方法。这些子类采用类似用内部类的形式进行定义。
枚举只有一个成员时,就可以作为一种单例的实现方式
6.注解
基本注解:
@SuppressWarnings
通过System.runFinalizersOnExit(true);的编译警告可以引出
@SuppressWarnings("deprecation")//编译时不报过时
@Deprecated //过时了
直接在类中增加一个方法,并加上@Deprecated,在另一个类中调用这个方法。
可以直观的看出方法被划线了,提示过时。
@Override
public boolean equals(Reflect other)方法。
如果类型不统一的话,那么equals()就不能成为重写,而是重载。
总结:
1.注解相当一种标记,在程序上加了注解就等于打上了某种标记,没加,就等于没有某种标记。
以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。
标记可以加载包,类,字段,方法,方法的参数以及局部变量上。
2.看java.lang包,可看到JDK中提供的最基本的annotation type。
元注解:
例子:
@Retention(RetentionPolicy.RUNTIME)
//Retention元注解,取值:RetentionPolicy.RUNTIME,RetentionPolicy.SOURCE,RetentionPolicy.CLASS
@Target({ElementType.TYPE,ElementType.METHOD})
//Target元注解,作用范围:类型,方法,字段,变量,参数。。
//如果,想要作用的范围是多个,可以采用{}形式设置。
public @interface ItheimaAnnotation
{
}
@ItheimaAnnotation
public class AnnotationTest
{
@SuppressWarnings("deprecation")//编译时不报过时
public static void main(String[] args)
{
System.runFinalizersOnExit(true);
//通过反射调用,判断类中是否含有指定的注解
if(AnnotationTest.class.isAnnotationPresent(ItheimaAnnotation.class))
{
//获取指定的注解
ItheimaAnnotation annotation=(ItheimaAnnotation) AnnotationTest.class.getAnnotation(ItheimaAnnotation.class);
System.out.println(annotation);
}
}
}
注意:元注解以及其枚举属性值不用记,只要会看jdk提供那几个基注解的API帮助文档的定义或其源代码,按图索骥即可查到。
或者直接查看java.lang.annotation包下面的类即可。
属性:
例子:
@ItheimaAnnotation(color="red",value="abc",array={1,2,3,4},annotationArr=@MetaAnnotation("fly")) //设置属性的值
public class AnnotationTest
{
@SuppressWarnings("deprecation")//编译时不报过时
@ItheimaAnnotation("xyz") //设置属性的值
public static void main(String[] args)
{
System.runFinalizersOnExit(true);
if(AnnotationTest.class.isAnnotationPresent(ItheimaAnnotation.class))
{
ItheimaAnnotation annotation=(ItheimaAnnotation) AnnotationTest.class.getAnnotation(ItheimaAnnotation.class);
System.out.println(annotation.color());
//调用属性的时候,以调用方法的形式
//获取属性的值的时候,当方法和类上都有注解,并且都设置了值,那么以类的值为准。
//没有设置值的情况下,以默认值为准。
System.out.println(annotation.value());
System.out.println(annotation.array().length);
//如果数组属性中只有一个元素,这时候属性值部分可以省略大括号
System.out.println(annotation.lamp().nextLamp().name());
System.out.println(annotation.annotationArr().value());
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface ItheimaAnnotation
{
//属性的声明
String color() default "blue";
String value();
//数组类型的属性
int[] array() default {3,4,5};
//枚举类型的属性
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
//注解类型的属性
MetaAnnotation annotationArr() default @MetaAnnotation("scy");
}
|
|