二、泛型
三、增强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对象
三、增强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
参考: