• JDK5的新特性


    本篇博客内容

      一、自动装箱和自动拆箱

      二、泛型

      三、增强for循环

      四、静态导入

      五、可变参数

      六、枚举

    一、自动装箱和自动拆箱  <=返回目录

       java有8种基本数据类型  byte、short、int、long、float、double、char、boolean,

      对应的有8种包装类型  Byte、Short、Integer、Long、Float、Double、Character、Boolean。

      所谓自动装箱就是:将基本数据类型的值直接赋值给对应包装类型的变量,java自动进行转换。(自动装箱:基本数据类型 ==> 包装类型)

      自动拆箱:将包装类型的值赋给基本数据类型的变量,java自动进行转换。(自动拆箱: 包装类型 ==> 基本数据类型)

    // 自动装箱
    Integer a = 1;
    // 执行上面那句代码的时候,系统为我们执行了: 
    // Integer a = Integer.valueOf(1); // 装箱 int ==> Integer
    
    // 自动拆箱
    int b = a;
    // 执行上面那句代码的时候,系统为我们执行了:
    // int b = a.intValue(); // 拆箱 Integer ==> int
    Integer i = 1;
    i += 1; // 先拆 i+1,再装i=i+1
    //执行上面那句代码的时候,系统为我们执行了:
    i = Integer.valueOf(i.intValue() + 1);

    二、泛型  <=返回目录

      泛型(一)泛型类和泛型方法

      泛型(二)封装工具类CommonUtils-把一个Map转换成指定类型的javabean对象

      泛型(三)模拟commons-dbutils

      泛型(四)类型通配符

      泛型(五)

    三、增强for循环   <=返回目录

       使用增强for时,先对要进行遍历的数据进行判空判断。

    package com.oy.test;
    
    public class Test {
    
        public static void main(String[] args) {
            String[] strArray = new String[] {"a", "b", "c"};
            // printArray(strArray);
            printArray2(strArray);
            
            Integer[] intArray = new Integer[] {1, 2 ,3};
            // printArray(intArray);
            printArray2(intArray);
            
            // printArray种使用增强for的代码不严谨,比如:
            Object[] objArray = null;
            // printArray(objArray); // 报错NullPointerException
            printArray2(objArray);
        }
        
        // 使用增强for的代码不严谨
        private static void printArray(Object[] objArray) {
            for (Object str : objArray) {
                System.out.println(str);
            }
        }
        
        // 改进
        private static void printArray2(Object[] objArray) {
            if (objArray != null && objArray.length > 0) {
                for (Object str : objArray) {
                    System.out.println(str);
                }
            }
        }
    }

    四、静态导入  <=返回目录

       自定义工具类,包含一个静态方法

    package com.oy.util;
    import java.util.UUID; public class Utils { // 获取UUID,32位字符串 public static String uuid() { return UUID.randomUUID().toString().replace("-", "").toUpperCase(); } }

      静态导入格式: import 包名.类名.方法名;

    package com.oy.test;
    
    // import com.oy.util.Utils; // 原来是导入类
    // 静态导入是:导入方法
    // 静态导入格式: import 包名.类名.方法名;
    import static com.oy.util.Utils.uuid;
    
    public class Test {
        public static void main(String[] args) {
            String str = uuid();
            System.out.println(str);
        }
        
    }

    五、可变参数  <=返回目录

       可变参数本质是一个数组

    public class Test {
    
        public static void main(String[] args) {
            System.out.println(add(1)); // 1
            System.out.println(add(1, 2)); // 3
            System.out.println(add(1, 2, 3)); // 6
            
            System.out.println(add(new int[] {1, 2})); // 3
            
            // System.out.println(add(1, new int[] {2, 3})); // 报错
        }
        
        private static int add(int... intArray) {
            int sum = 0;
            for (int i : intArray) {
                sum += i;
            }
            return sum;
        }
    }

      可变参数只能作为方法的最后一个参数

    public class Test {
    
        public static void main(String[] args) {
            System.out.println(add(1)); // 1
            System.out.println(add(1, 2)); // 3
            System.out.println(add(1, 2, 3)); // 6
            
            System.out.println(add(1, new int[] {2, 3})); // 6
        }
        
        // 可变参数只能作为方法的最后一个参数
        // private static int add(int a, int... intArray, int b) { // 报错
        private static int add(int a, int... intArray) {
            int sum = 0;
            sum += a;
            for (int i : intArray) {
                sum += i;
            }
            return sum;
        }
    }

    六、枚举  <=返回目录

    6.1、什么是枚举:

      将变量的值罗列出来,变量的值只限于列举出来的值的范围内。举例:一周只有7天,一年只有12个月等。回想单例设计模式:单例类是一个类只有一个实例。那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例。这才能是枚举类。

    6.2、自己实现枚举类

      最简单的枚举类

    package com.oy.test;
    
    /**
     * @author oy
     * @date 2019年5月26日 下午10:58:44
     * @version 1.0.0
     */
    public class Direction {
        public static final Direction FRONT = new Direction();
        public static final Direction BEHIND = new Direction();
        public static final Direction LEFT = new Direction();
        public static final Direction RIGHT = new Direction();
        
        private Direction () {}
    } 

      添加一个字段

    package com.oy.test;
    
    public class Direction2 {
        public static final Direction2 FRONT = new Direction2("front");
        public static final Direction2 BEHIND = new Direction2("behind");
        public static final Direction2 LEFT = new Direction2("left");
        public static final Direction2 RIGHT = new Direction2("right");
    
        // private Direction2 () {}
    
        private String name;
        public String getName() {
            return name;
        }
    
        private Direction2(String name) {
            this.name = name;
        }
    
    }

       添加一个抽象方法

    package com.oy.test;
    
    public abstract class Direction3 {
        public static final Direction3 FRONT = new Direction3("front") {
    
            @Override
            void show() {
                System.out.println("front show...");
            }
    
        };
        public static final Direction3 BEHIND = new Direction3("behind") {
    
            @Override
            void show() {
                System.out.println("behind show...");
            }
    
        };
        public static final Direction3 LEFT = new Direction3("left") {
    
            @Override
            void show() {
                System.out.println("left show...");
            }
    
        };
        public static final Direction3 RIGHT = new Direction3("right") {
    
            @Override
            void show() {
                System.out.println("right show...");
            }
    
        };
    
        // private Direction2 () {}
    
        private String name;
        public String getName() {
            return name;
        }
    
        private Direction3(String name) {
            this.name = name;
        }
    
        abstract void show();
    }

      

      测试

    public class Test {
    
        public static void main(String[] args) {
            Direction d1 = Direction.FRONT;
            System.out.println(d1);
            
            Direction2 d2 = Direction2.FRONT;
            System.out.println(d2);
            System.out.println(d2.getName()); // front
            
            Direction3 d3 = Direction3.FRONT;
            System.out.println(d3);
            System.out.println(d3.getName()); // front
            d3.show(); // front show...
        }
    }

    6.3、enum

      enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

      只有枚举项的枚举类

    public enum Direction {
        FRONT, BEHIND, LEFT, RIGHT;
    }

      

      添加一个字段

    public enum Direction {
        FRONT("front"), BEHIND("behind"), LEFT("left"), RIGHT("right");
        
        private String name;
        public String getName() {
            return name;
        }
        
        private Direction(String name) {
            this.name = name;
        }
    }

      添加一个抽象方法

    public enum Direction {
        FRONT("front") {
            @Override
            void show() {
                System.out.println("front show...");
            }
        }, BEHIND("behind") {
            @Override
            void show() {
                System.out.println("behind show...");
            }
        }, LEFT("left") {
            @Override
            void show() {
                System.out.println("left show...");
            }
        }, RIGHT("right") {
            @Override
            void show() {
                System.out.println("right show...");            
            }
        };
        
        private String name;
        public String getName() {
            return name;
        }
        
        private Direction(String name) {
            this.name = name;
        }
        
        abstract void show();
    }

      

    6.4、使用枚举的注意事项

      定义枚举类要用关键字enum;
      所有枚举类都是Enum的子类;
      枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略;
      枚举类可以有构造器,但必须是private的,它默认的也是private的。枚举项的用法比较特殊:枚举(“”);
      枚举类也可以有抽象方法,但是枚举项必须重写该方法;


    6.5、枚举在switch语句中的使用

    package com.oy.test;
    
    public class Test {
    
        public static void main(String[] args) {
            print(Direction.RIGHT);
        }
    
        private static void print(Direction d) {
            switch (d) { // 括号里面是枚举类型
            case FRONT: // 这里不需要Direction.FRONT
                System.out.println(d.getName());
                break;
            case BEHIND:
                System.out.println(d.getName());
                break;
            case LEFT:
                System.out.println(d.getName());
                break;
            case RIGHT:
                System.out.println(d.getName());
                break;
            default:
                break;
            }
        }
    }

    6.6、枚举类的常用方法

      int compareTo(E o)
      String name(): 返回次枚举常量的名称
      int ordinal(): 返回此枚举常量的编号
      String toString(): 返回此枚举常量的名称
      <T> T valueOf(Class<T> type, String name)
      values() : 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便

    public class Test {
        public static void main(String[] args) {
            // int compareTo(E o)
            Direction d1 = Direction.FRONT; // 编号0
            Direction d2 = Direction.BEHIND; // 编号1
            Direction d3 = Direction.LEFT; // 编号2
            Direction d4 = Direction.RIGHT; // 编号3
            
            System.out.println(d1.compareTo(d1)); // 0-0=0
            System.out.println(d1.compareTo(d2)); // 0-1=-1
            System.out.println(d1.compareTo(d3)); // 0-2=-2
            System.out.println(d1.compareTo(d4)); // 0-3=-3
            
            // String name(): 返回此枚举常量的名称
            System.out.println("d2.name: " + d2.name()); // BEHIND
            
            // int ordinal(): 返回此枚举常量的编号
            System.out.println("d3.ordinal: " + d3.ordinal()); // 2
            
            // String toString()
            System.out.println("d2.toString: " + d2.toString()); // BEHIND
            
            // <T> T valueOf(Class<T> type, String name)
            //java.lang.IllegalArgumentException: No enum constant com.oy.test.Direction.LEFT1
            // Direction d5 = Direction.valueOf("LEFT1");
            Direction d5 = Direction.valueOf("LEFT");
            System.out.println("d5: " + d5);
            
            // 遍历枚举类
            Direction[] directs = Direction.values();
            int i = 0;
            for (Direction dire : directs) {
                System.out.println("directs[" +  (i++) + "]=" + dire.toString());
            }
        }
    }

      结果:

    0
    -1
    -2
    -3
    d2.name: BEHIND
    d3.ordinal: 2
    d2.toString: BEHIND
    d5: LEFT
    directs[0]=FRONT
    directs[1]=BEHIND
    directs[2]=LEFT
    directs[3]=RIGHT

    参考:

      (1)详解Java的自动装箱与拆箱(Autoboxing and unboxing)

      (2)java enum(枚举)使用详解 + 总结

  • 相关阅读:
    个人作业二-举例分析流程图与活动图的区别与联系
    四则运算
    实验四 决策树算法及应用
    实验三 朴素贝叶斯算法及应用
    实验二 K-近邻算法及应用
    实验一 感知器及其应用
    实验三 面向对象分析与设计
    实验二 结构化分析与设计
    实验一 软件开发文档与工具的安装与使用
    ATM管理系统
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/10924512.html
Copyright © 2020-2023  润新知