Java5新特性概览

1、摘要

Java5新增特性主要包括:自动装箱、可变参数、for each 循环、静态导入、printf格式化输出、Scanner、泛型、枚举和注解等,下面按照所属类别逐一介绍。

2Java基础部分

Java基础部分主要包括自动拆装箱、可变参数、for each 循环和静态导入。

 

2.1、自动装箱

       int a = 12;

      Integer b = null;

 

      // jdk1.5之前的版本

      b = new Integer(a);

      a = b.intValue();

 

      // jdk1.5之后

      b = 12;

      a = new Integer(32);

 

2.2、可变参数

   publicstaticvoid testFun(int...args){//注意方法的参数写法

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

        

         System.out.print(args[i]+" ");

      }

      System.out.println();

   }

  

   publicstaticvoid main(String[] args) {

 

      //可以传递多个参数

      testFun(1,2,3,4);

  

      //可以传递一个数组

      testFun(newint[]{5,6,7,8});     

   }

 

2.3、for each 循环

   public static void testFun(int...args){

      for(int i :args){

         System.out.print(i+" ");

      }

      System.out.println();

   }

   //for each 用于遍历数组和集合

   publicstaticvoid main(String[] args) {

 

      testFun(1,2,3,4);

     

      List<String> all=new ArrayList<String>();

      all.add("element1");

      all.add("element2");

      for (String str : all) {

         System.out.print(str+" ");

      }

   }

 

2.4、静态导入

//import static test.Utils.*;

import static test.Utils.toUpper;

publicclass Test4 {

 

   publicstaticvoid main(String[] args) {

      //传统使用方法

      System.out.println(Utils.toUpper("huangqiiqng"));

      //静态导入后的使用方法

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

   }

}

Utils类——

publicclass Utils {

 

   //转换成大写,然后返回。

   publicstatic String toUpper(String str){

      return str.toUpperCase();

   }

}

 

3IO部分

IO部分主要包括printf格式化输出和Scanner扫描输入。

 

3.1、printf 格式化输出

   publicstaticvoid main(String[] args) {

      System.out.printf("字符串类型:%s,整形:%d,浮点型:%.2f","hello",10,10.256);

   }

/*

 %d:表示此处输出10进制整形变量

 %c:表示输出char字符变量

 %s:表示输出字符串类型变量

 %f:表示输出浮点类型变量

 %5.3f:表示输出的浮点类型变量显示5位,其中3位为小数。

*/

 

3.2、scanner 扫描器

Java5新特性概览
 

public class Test5 {

   public static void main(String[] args) {

      //printer1();

      //printer2();

      printer3();

   }

   // 传统控制台处理方式

   public static void printer1() {

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      try {

         System.out.println("请输入年龄:");

         String line = br.readLine();

         System.out.println("年龄为:" + line);

      } catch (IOException e) {

         e.printStackTrace();

      }

   }

   // Scanner处理控制台输入

   public static void printer2() {

      Scanner s=new Scanner(System.in);

      System.out.println("请输入年龄:");

      if(s.hasNextInt()){//此处可判断输入类型

         System.out.println("年龄为:"+s.nextInt());

      }else{

         System.out.println("输入的年龄不合法!");

      }

   }

   // Scanner处理文件输入

   public static void printer3() {

      Scanner s = null;

      try {

         s = new Scanner(new File("D:/Hello.java"));

       //设置分隔符,不设置,则默认使用空格进行分割

       s.useDelimiter("\\n");

       while(s.hasNext()){

         System.out.print(s.next());

        } //关闭扫描器s.close;

      } catch (FileNotFoundException e) {

         e.printStackTrace();

      }

     }

}

4、泛型

4.1 泛型类的创建和使用

//创建泛型类

class Info<T> {

   private T age;

   public T getAge() {

      returnage;

   }

   publicvoid setAge(T age) {

      this.age = age;

   }

}

//使用泛型类

public class Test7 {

   public static void main(String[] args) {

      //传一个整型

      Info<Integer> info = new Info<Integer>();

      info.setAge(12);

      int intAge = info.getAge();

     

      //传一个字符串

      Info<String> info2 = new Info<String>();

      info2.setAge("24");

      String strAge = info2.getAge();

     

      getInfo(info);

      //getInfo(info2);//该句会报错

     

   }

   //通配符 ?

   public static void getInfo(Info<? extends Number> info) {

      System.out.println(info.getAge());

   }

}

/*

 * ?extends类名 - 表示传入的泛型参数必须是该类或者该类的子类

 * ?super类名 - 表示传入的泛型参数必须为该类或者该类的父类

 */

 

 

4.2、泛型方法的创建和使用

   //泛型方法

   publicstatic <T> T getInfo(T t){

      return t;

   }

   publicstaticvoid main(String[] args) {

        //输出:14

      System.out.println(getInfo(6)+getInfo(8));

       //输出:hello hqq

      System.out.println(getInfo("hello")+getInfo(" hqq"));

   }

5、枚举

5.1、创建枚举

public enum MyEnum {

    LOCKED,

     AIM,

     SHOOT

}

 

 

5.2、使用枚举

public class TestEnum {

 

   public static void main(String args[]) {

      doAction(MyEnum.LOCKED);

      doAction(MyEnum.AIM);

      doAction(MyEnum.SHOOT);

     

      //for each 遍历枚举中的值

      MyEnum[] myEnums = MyEnum.values();

      for (MyEnum myEnum : myEnums) {

         System.out.println(myEnum);

      }

   }

 

   // 根据action执行相应的动作

   public static void doAction(MyEnum action) {

      switch (action) {

      caseLOCKED:

         System.out.println("1:锁定目标");

         break;

      caseAIM:

         System.out.println("2:瞄准目标");

         break;

      caseSHOOT:

         System.out.println("3:射击");

         break;

      default:

         System.out.println("对不起,该动作还未定义!");

      }

   }

}

/*

打印结果为:

1:锁定目标

2:瞄准目标

3:射击

LOCKED

AIM

SHOOT

 */

 

6、注解Annotation

注解Annotation(用于替代xml配置信息,实现代码与配置的合并)

 

6.1、常见注解

系统自带的Annotation@Override@SuppressWarings@Deprecate

@Override——表示下面的方法是重写方法

   @Override

   public String toString() {

      // TODO Auto-generated method stub

      returnsuper.toString();

   }

@SuppressWarings——用来压制警告信息

   @SuppressWarnings({ "unused", "unchecked" })

   publicvoid testUnused() {

 

      List list = new ArrayList();

 

   }

@Deprecated——表示该方法已经过时,不建议使用。

   @Deprecated

   publicvoid testDeprecate(){

     

   }

 

6.2、创建注解

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

 

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

@Retention(value=RetentionPolicy.RUNTIME)

public @interface MyAnnotation {

 

   String key() default"I am key";

   String value() default"I am value";

  

}

/*

 --------------Annotation的作用范围:@Retention---------------

 SOURCE,在源代码中作用

 CLASS,在class文件中作用

 RUNTIME,在运行时作用

 如果需要在代码中通过反射获得Annotation的属性值,必须将作用范围设置为RUNTIME

 --------------Annotation的使用位置:@Target----------------

 只能在Annotation中出现——ElementType.ANNOTATION_TYPE

 只能在构造方法中出现——ElementType.CONSTRUCTOR

 只能在方法上使用——ElementType.METHOD

 只能在类或者接口中使用——ElementType.TYPE

8种,其余省略、、、

 */

 

 

6.3、使用注解

import java.lang.reflect.Method;

@MyAnnotation(key = "", value = "Test9")

public class Test9 {

   public static void main(String[] args) {

      try {

         Class test9 = Class.forName("test.Test9");

         Method toString = test9.getMethod("toString", null);

         MyAnnotation myAnnotation = toString

                .getAnnotation(MyAnnotation.class);

         System.out.println("key= " + myAnnotation.key());

         System.out.println("value= " + myAnnotation.value());

 

         myAnnotation = (MyAnnotation) test9

                .getAnnotation(MyAnnotation.class);

         System.out.println("key= " + myAnnotation.key());

         System.out.println("value= " + myAnnotation.value());

      } catch (Exception e) {

         e.printStackTrace();

      }

   }

 

   @MyAnnotation

   @Override

   public String toString() {

      return"--toString()--";

   }

}

 

你可能感兴趣的:(java)