黑马程序员----------JDK1.5新特性

来源:互联网 发布:程序员眼镜 编辑:程序博客网 时间:2024/04/30 14:09

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

Jdk1.5的新特性

特性一:静态导入

Import语句可以导入一个类或是某个包中所有的类

Import static 语句可以导入一个类中某个静态方法或是所有静态方法

例如:Math类提供了很多数学运算的静态方法,通常情况小我们是以Math.abs()这样的方式来进行调用函数,但是我们可不可以写出abs();

在JDK1.5之后,可以使用import static语句导入一个类中的某个静态方法或是所有静态方法

Import static java.lang.Math.abs  就可以直接写一个abs()函数

Import static java.lang.Math.* 就可以直接调用Math类中所有静态方法

特性二:泛型

在类上明确参数类型

在jdk1.4版本前,容器什么类型的对象对可以存储,但是在取出时,需要用到对象的特有内容是,需要向下转型,但是由于对象类型不一致,导致向下转型发生了ClassCastException异常,为了避免这个问题,只能主观上控制,往集合中存储的对象类型保持一致

Jdk1.5以后解决了该问题,在定义集合时,就直接明确集合中存储元素的具体类型

这样,在编译器编译时,就可以对集合中存储的对象类型进行检查

一旦发现类型不匹配,就编译失败,这个技术就是泛型技术

好处:

  1.将运行时期的问题转移到了编译时期,可以更好的让程序员发现问题并解决问题

2.避免向下转型的麻烦

总结:泛型就是应用在编译时期的一项安全机制

泛型的擦除:编译器通过泛型对元素类型进行检查,只要检查通过,就会生成class文件,但在class文件中,就将泛型标识去掉了

泛型的表现:泛型在集合框架中应用的范围很大,

        什么时候需要泛型呢?1.只要看到类,或者接口在描述时右边定义<>,就需要泛型

        其实是,容器在不明确操作元素类型的情况下,对外提供了一个参数<>

        使用容器是,只要将具体的类型实参触底给该参数即可,

        说白了,泛型就是,传递类型参数。

当类型不明确时,使用泛型

特性三:增强for循环

格式:for(数据类型变量名 :被遍历的集合(collection)或者数组) {执行语句}

说明:

        1、对集合进行遍历。只能获取集合元素。但是不能对集合进行操作。可以看作是迭代器的简写形式。

        2、迭代器除了遍历,还可以进行remove集合中元素的动作。如果使用ListIterator,还可以在遍历过程中对集合进行增删改查的操作。

传统for和高级for的区别:

       高级for有一个局限性。必须有被遍历的目标(集合或数组)。

       传统for遍历数组时有索引。

建议在遍历数组的时候,还是希望使用传统for。因为传统for可以定义角标。

注意:变量类型前可加修饰符,如final(可被局部内部类访问到)。

特性四:自动拆装箱

自动拆箱、装箱:向操作int一样操作Integer

Integer i=4;自动装箱,同等于Integeri=new Integer(4);也同等于Integer i=Integer.valueof(4);通过调用静态value()实现其中4不是一个数字,是一个对象

i=i+6;右边的i自动拆箱    等同于i=i.intValue()+6;运算完成后又一次自动装箱

Integer x=newInteger(100);  Integer y=newInteger(100);

Syso(x==y);//false     Syso(x.equals(y));//ture

Integer m=100;Integer n=100;

Syso(m==n); //true   syso(m.equals(n));true

如果等于m、n=200时 false, true

原因是,自动装箱的值如果在byte范围之内(-128~127)相同的值不会单独开辟空间,而是重复使用

享元模式:很多对象的一系列属性相同,将这些相同的属性封装成一个对象,不同的属性变成方法的参数,称为外部状态。相同的属性称为内部状态

特性五:可变参数

可变参数可以声明一个接受可变数码参数的方法(类似多个方法的重载,只不过是可变参数提供一个方法实现多个方法的重载,变得只是方法其中的参数)

注意:可变参数必须是函数声明中的最后一个参数

例:main{syso(add(2,3,5));}

public static void add(intx,int…args){
    int sum=x;

    for(int i=1,i<=args.length;i++){

    sum+=args[i];

}

}

特性六:枚举

在程序设计中,有时会用到由若干个有限数据元素组成的集合,如一周内的星期一到星期日七个数据元素组成的集合,由三种颜色红、黄、绿组成的集合,一个工作班组内十个职工组成的集合等等,程序中某个变量取值仅限于集合中的元素。此时,可将这些数据集合定义为枚举类型。

枚举中可以有构造方法,也可以有抽象函数

构造函数:

publicenum WeekDay {

        SUN(1), MON, TUE, WED, THI, FRI, SAT;

        private WeekDay(){

            System.out.println("first");

           

        }

        private WeekDay(int day){

            System.out.println("second");

        }

    }

枚举中的构造方法必须在元素列表之后,而且必须是私有的

带有抽象方法的枚举类

Public enum TrafficLamp{

RED,YELLOW,GERRN;

YELLOW(5){

            @Override

            public TrafficLamp nextLamp() {

                return RED;

            }

        };

        publicabstract TrafficLamp nextLamp();

        privateint time;

        privateTrafficLamp(int time){

            this.time=time;

        }

特性七:注解

了解注解及Java提供的几个基本注解

注解:相当于一个标记,加上注解就等于给程序打上了标记

标记可以加载包,类,字段,方法上

api中常用的三个注解:

@SuppressWarnings:取消显示指定的编译器警告  SOURCE阶段

@Override:表示一个方法声明打算重写超类中的另一方法声明,如果此方法利用此注释类型进行注解但没有重写超类方法,编译器会报错  SOURCE阶段

@Depercated:表示元素已过时,存在更好的选择

定义一个注解类

@Retetion元注解:三种取值

RetetionPolicy.SOURCE—>java源文件

RetetionPolicy.Class—>class文件

RetrtionPlicy.RUNTIME-->内存中的字节码

@Retention(RetentionPolicy.RUNtIME)//元注解

@Target({ElementType.METHOD,ElementType.TYPE})

//T染个头的默认值为任何元素,设置Target等于ElementType.METHOD,原来加载在类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就可以了

public @interface ItcastAnnotation {   

}

@ItcastAnnotation

public class Test8 {

    @SuppressWarnings("deprecation")

    @ItcastAnnotation

    publicstatic void main(String[] args) {        if(Test8.class.isAnnotationPresent(ItcastAnnotation.class)){

ItcastAnnotationannotation=(ItcastAnnotation)Test8.class.

getAnnotation(ItcastAnnotation.class);

            System.out.println(annotation);

        }

    }

    @Deprecated

    publicstatic void sayHello(){

        System.out.println("hello java");

    }

为注解增加基本属性

@Retention(RetentionPolicy.RUNTIME)//元注解

@Target({ElementType.METHOD,ElementType.TYPE})

public @interface ItcastAnnotation {   

 String color default"blue";//一般类型

int[] arrayattr default {1,2,3}//数组类

EnumTest.TrafficLamp.lamp default EnumTest.TrafficLamp.GREEN//枚举类型

}

@ItcastAnnotation(color="red",arrayattr={3,4,5})

public class Test8 {

    @ItcastAnnotation

    public static voidmain(String[] args) {

    syso(annotation.color());

    syso(annotation.arrayattr().length());

    syso(annotation.lamp().nextLamp().name());

}

 


0 0
原创粉丝点击