JDK1.5java增加的新特性:

自动装箱/拆箱      增强for     泛型      枚举      静态导入      可变参数

1 自动装箱/拆箱

* JDK1.5允许开发人员把一个基本类型直接赋给对应的包装类变量或者赋给Object类型的变量,这个过程称为自动装箱。

* 自动装箱和自动拆箱相反,即把包装类对象直接赋给一个对应的基本类型变量。

也就是基本类型与其对应的引用类型之间的转换,但是不能乱用,一般我们要采用基本类型,如果在使用时不注意,可能会造成程序低效率运行。

int ----- Integer
float ----- Float
double ---- Double
char ------- Character
boolean ---- Boolean
short ---- Short
long ---- Long
byte ---- Byte

比如:

Long  sum = 0;

for(long i =0;i<10000;i++){

  sum += i;

}

此处造成程序低效率就在于频繁的进行拆箱装箱操作。注意sum被定义成了Long而不是long。

还有两个高精度的类

  BigInteger

  BigDecimal


2 增强for

优缺点:

  优点:遍历更简单,在集合遍历中增强for就是代替迭代器的

  弊端:增强for的目标不能为null(即数组或集合不能为null),所以在遍历之前需要进行判断

格式:

  for(元素数据类型 变量:数组或集合){

      ....................................
      使用变量,该变量就是集合或者数组中的元素
  }

举例:

String[]  names = {"小明","小李","小王"};

for(String  name : names){

   System.out.println("hello "+name);

}


3 泛型

引入泛型的好处:

     1)去除了原先必须的冗长的强制类型转换

     2)能够在编译期检测出错误,不至于在运行时才发现,消除了潜在的错误,提高代码运行的可靠性。

     3)使用XJad.exe反编译工具可以看到,在编译期间泛型被擦除。

泛型基本应用:

1)泛型类

*把泛型定义在类上

*格式:public class 类名<泛型类型1.....>

*注意:泛型类型必须是引用类型

2)泛型方法

* 把泛型定义在方法上:方法可以接收任意类型

* 格式:public<泛型类型> 返回类型 方法名(泛型类型)

3)泛型接口

* 把泛型定义在接口上

* 格式:public interface 接口名<泛型类型1.....>

例1:一个简单的泛型类

package basic.demo;

public class FanTypeClass<T>{
  private T obj;

  public T getObj() {
    return obj;
  }

  public void setObj(T obj) {
    this.obj = obj;
  }
}

测试类:

package basic.demo;

public class FanTypeDemo {
  public static void main(String[] args) {

    FanTypeClass<String> obj1 = new FanTypeClass<String>();  //使用泛型
    obj1.setObj("hello");   //这时候set方法接收的参数必须是String,如果不传该类型,在编译期就会报错
    String s = obj1.getObj();  //这种方式下不需要强转
    System.out.println(s);

    FanTypeClass obj2 = new FanTypeClass();  //没使用泛型
    obj2.setObj(3);
    int num = (int) obj2.getObj();          //需要进行强转,如果不小心写错了就会产生ClassCastException,即类型转换异常

    String num = (String)obj2.getObj();    //这样写在编译期并不会报错,但是一旦执行就会产生类型转换异常
    System.out.println(num);
  }
}

例2:泛型方法的使用

package basic.demo;

public class FanTypeMethod {
  public <T> void show(T t){
    System.out.println(t);
  }
}

测试类:

package basic.demo;

public class FanTypeDemo {
  public static void main(String[] args) {

    FanTypeMethod ft = new FanTypeMethod();
    ft.show("hello");
    ft.show(100);
    ft.show(true);

  }

}

输出结果:

hello

100

true

例3 泛型接口

分为两种用法:子类实现时已知将来使用类型和子类实现时未知使用类型(这一种常见)

package basic.demo;

public interface FanTypeInter<T>{
  public abstract void show(T t);
}

package basic.demo;   //子类未知要使用的类型,故还是用泛型T

public class FanTypeInterImpl<T>  implements FanTypeInter<T> {
  @Override
  public void show(T t) {
    System.out.println(t);
  }
}

测试:

package basic.demo;

public class FanTypeDemo {
  public static void main(String[] args) {
    FanTypeInter<String> fti1 = new FanTypeInterImpl<String>();
    fti1.show("hello");

    FanTypeInter<Integer> fti2 = new FanTypeInterImpl<Integer>();
    fti2.show(100);

  }

}

泛型高级应用(通配符):

1)泛型通配符 <?>

*任意类型,如果没有明确,那么就是Object以及任意的java类

2)? extends E

* 向下限定,E及其子类

3)? super E

* 向上限定,E及其父类

例:理解高级应用:红色标注皆为错误用法

package basic.demo;

import java.util.ArrayList;
import java.util.List;

public class FanTypeSeniorDemo {
  public static void main(String[] args) {
    //泛型如果明确写,必须前后一致
    // List<Object> list1 = new ArrayList<Object>();
    // List<Object> list2= new ArrayList<Person>(); //error
    // List<Object> list3 = new ArrayList<Student>(); //error
    // List<Object> list4 = new ArrayList<Teacher>(); //error

    //?表示任意类型都是可以的
    // List<?> list1 = new ArrayList<Object>();
       // List<?> list2= new ArrayList<Person>();
    // List<?> list3 = new ArrayList<Student>();
    // List<?> list4 = new ArrayList<Teacher>();

    //? extends E 向下限定:E及其子类
    // List<? extends Person> list1 = new ArrayList<Object>(); //error
    // List<? extends Person> list2= new ArrayList<Person>();
    // List<? extends Person> list3 = new ArrayList<Student>();
    // List<? extends Person> list4 = new ArrayList<Teacher>();

    //? super E 向上限定 E及其父类
    List<? super Person> list1 = new ArrayList<Object>();
    List<? super Person> list2= new ArrayList<Person>();
    List<? super Person> list3 = new ArrayList<Student>(); //error
    List<? super Person> list4 = new ArrayList<Teacher>(); //error

  }

}
class Person{

}
class Student extends Person{

}
class Teacher extends Person{

}


4 枚举

 关键字Enum,用于定义一个枚举类

为什么需要枚举?
一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。

枚举类具有如下特性
  枚举类也是一种特殊形式的Java类。
  枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
  与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。
  枚举类也可以实现接口、或继承抽象类。
  JDK5中扩展了switch语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型。
  若枚举类只有一个枚举值,则可以当作单例设计模式使用。

Java中声明的枚举类,均是java.lang.Enum类的子类,它继承了Enum类的所有方法。

常用方法:
  name():返回此枚举常量的名称,在其枚举声明中对其进行声明。
  ordinal():返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。也可以称为索引
  valueOf(Class enumClass, String name)
  values()     此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。


5 静态导入

可以直接导入到方法的级别。

格式:import static 包名....类名.方法名;

注意:

  *方法必须是静态的

  *如果有多个同名的静态方法,容易不知道使用谁??这个时候要使用该特性,需要加前缀。由此可见,意义不大。所以一般不用,仅需知道就行。

例1:使用静态导入,使用静态方法时直接使用。

package basic.demo;

import static java.lang.Math.max;
import static java.lang.Math.min;

public class StaticImportDemo {
  public static void main(String[] args) {

    int num1 = 23;
    int num2 = 30;

    max(num1,num2);
    min(num1,num2);
  }
}

例2:编写重名的静态方法,然后一起在StaticImportDemo使用:

package basic.demo;

public class MyMath {
  public static int max(int num1,int num2){
    return num1>num2?num1:num2;
  }

  public static int min(int num1,int num2){
    return num1>num2?num2:num1;
  }
}

package basic.demo;

import static java.lang.Math.max;
import static java.lang.Math.min;

import static basic.demo.MyMath.max;
import static basic.demo.MyMath.min;  //使用都加前缀了,也就不需要静态导包了

public class StaticImportDemo {
  public static void main(String[] args) {

    int num1 = 23;
    int num2 = 30;

    java.lang.Math.max(num1,num2);  //必须加包名前缀,否则报错
    basic.demo.MyMath.min(num1,num2);//必须加包名前缀,否则报错,但是这样一加前缀就没有导包的意义了。。。。。
  }
}


6 可变参数

Effective Java不建议使用该特性,而且在java编程思想中也说了此特性的隐患。

*定义方法的时候不知道定义多少个参数,故引入可变参数的概念。

使用格式:

* 修饰符  返回值类型  方法名(数据类型...变量名){}

注意:

 * 这里的变量其实是一个数组

*如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个,否则编译器报错。

举例:

*Arrays工具类中的一个方法:

  public static <T>List<T> asList(T...a)

例1:简单使用:

package basic.demo;
public class ChangeParaDemo {
  public static void main(String[] args) {
    int[] data = {1,2,3,4};
    System.out.println(sum(data));

    int sum = sum(2,3,4,5);
    System.out.println(sum);

    sum = sum(2,5);
    System.out.println(sum);
  }

  private static int sum(int...num) {
    int result = 0;
    for(int i:num){
      result += i;
    }
    return result;
  }
}

例2 方法中有多个参数:java在编译器期间就强调可变参数必须在最后的位置。

package basic.demo;
public class ChangeParaDemo {
  public static void main(String[] args) {
    int sum = sum(100,1,2,3,4);
    System.out.println(sum);       //如果把可变参数放在方法参数的最后,结果是10

    int sum = sum(1,2,3,4,100);

    System.out.println(sum);   //如果可变参数放在前面,会报错
  }

  private static int sum(int special,int...num) {
    int result = 0;
    for(int i:num){
      result += i;
    }
    return result;
  }

  //error: 错误写法

  //出错原因,因为可变参数变量其实是一个数组,如果把可变参数放在前面,则special变量被视为数组的一部分,也就是说你只传了一个参数,和原方法参数个数不一致

  private static int sum(int...num,int special) {
    int result = 0;
    for(int i:num){
      result += i;
    }
    return result;
  }

}


JDK1.5java新特性的更多相关文章

  1. JDK1.7新特性

    jdk1.7新特性 1 对集合类的语言支持: 2 自动资源管理: 3 改进的通用实例创建类型推断: 4 数字字面量下划线支持: 5 switch中使用string: 6 二进制字面量: 7 简化可变参 ...

  2. jdk1.6新特性

    1.Web服务元数据 Java 里的Web服务元数据跟微软的方案基本没有语义上的区别,自从JDK5添加了元数据功能(Annotation)之后,SUN几乎重构了整个J2EE体 系, 由于变化很大,干脆 ...

  3. JDK1.8 新特性

    jdk1.8新特性知识点: Lambda表达式 函数式接口 *方法引用和构造器调用 Stream API 接口中的默认方法和静态方法 新时间日期API https://blog.csdn.net/qq ...

  4. JDK1.6新特性,WebService强化

    Web service是一个平台独立的,松耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  5. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  6. JDK1.7新特性(2):异常和可变长参数处理

    异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面. 1. 为了防止异常覆盖,给Throwable类增加了addSuppressed方法,可 ...

  7. jdk1.8新特性应用之Iterable

    我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback ...

  8. jdk1.8新特性之方法引用

    方法引用其实就是方法调用,符号是两个冒号::来表示,左边是对象或类,右边是方法.它其实就是lambda表达式的进一步简化.如果不使用lambda表达式,那么也就没必要用方法引用了.啥是lambda,参 ...

  9. jdk1.8新特性之lambda表达式

    lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lamb ...

随机推荐

  1. LabVIEW之生产者/消费者模式--队列操作

    LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...

  2. linux 使用dd命令清空文件

  3. Gruntjs提高生产力(一)

    gruntjs是一个基于nodejs的自动化工具,只要熟悉nodejs或者又一定js经验就可以熟练应用. 1. 安装 a. 保证已安装了nodejs,并带有npm b.安装客户端命令行工具,grunt ...

  4. Spring Boot Logback几种日志详解

    日志对于应用程序来说是非常重要的,Spring框架本身集成了不少其他工具,我们自身的应用也会使用到第三方库,所以我们推荐在Spring应用中使用SLF4J/Logback来记录日志. SLF4J与Lo ...

  5. 【MySQL】查看当前存储引擎

    一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你的mysql当前默认的存储引擎: m ...

  6. Quartz教程:快速入门

    原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...

  7. redis的list类型以及其操作

    lists类型 给你个图;' lists类型以及操作List是一个链表结构,主要功能是push.pop.获取一个范围的所有值等等,操作中key理解为链表的名字.Redis的list类型其实就是每一个子 ...

  8. Python的集合框架

    Python内置了四种集合框架(list.tuple.dict.set) list:list是一种有序的集合 list里面的元素的数据类型也可以不同,list元素也可以是另一个list In [28] ...

  9. CSS 清除浮动 clear 属性

    CSS 清除浮动 clear 属性用于设定元素哪一侧不允许有其他浮动元素(而并非取消元素的浮动). 可能的取值如下: 取值 说明 none 默认值,允许两侧都有浮动元素 left 左侧不允许有其他浮动 ...

  10. 《Drools7.0.0.Final规则引擎教程》第4章 4.5RHS语法

    RHS语法 使用说明 RHS是满足LHS条件之后进行后续处理部分的统称,该部分包含要执行的操作的列表信息.RHS主要用于处理结果,因此不建议在此部分再进行业务判断.如果必须要业务判断需要考虑规则设计的 ...