本篇博客内容

  一、自动装箱和自动拆箱

  二、泛型

  三、增强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)); //
System.out.println(add(1, 2)); //
System.out.println(add(1, 2, 3)); // 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)); //
System.out.println(add(1, 2)); //
System.out.println(add(1, 2, 3)); // System.out.println(add(1, new int[] {2, 3})); //
} // 可变参数只能作为方法的最后一个参数
// 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(枚举)使用详解 + 总结

JDK5的新特性的更多相关文章

  1. Java基础和JDK5.0新特性

    Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...

  2. Javaweb学习笔记——(七)——————myexlipse基本使用、jdk5.0新特性及反射讲解

    1.debug调试模式: *使用这种模式,调试程序(看到程序运行停止在这一行) -显示出来行号 -双击左边,出现一个圆点,表示设置了一个断点 *使用debug as方式,运行程序 -特使是否进入到调试 ...

  3. JDK5的新特性之 增强for

      package cn.itcast.day19.foreach; import java.util.ArrayList; import java.util.Collection; import j ...

  4. Day07 jdk5.0新特性&Junit&反射

    day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装M ...

  5. JDK5的新特性:泛型、可变参数、静态导入

    数组可以在创建的时候就指定存放的数据类型,这样放入不同类型的时候就会发生编译错误. 而集合却可以存储多种不同类型,这样的话如果是遍历的时候在集合中装了好多不同的数据类型的时候,十分容易发生类型转换错误 ...

  6. Java JDK5.0新特性

    JDK5.0新特性 虽然JDK已经到了1.8 但是1.5(5.0)的变化是最大的 1. 增强for循环 foreach语句 foreach简化了迭代器 作用: 对存储对象的容器进行迭代 (数组, co ...

  7. JavaSE 学习笔记之Jdk5.0新特性(十九)

    Jdk5.0新特性: Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性. --------------------- ...

  8. JDK5.0新特性 (Day_07)

      JDK5.0新特性   目录 静态导入 自动装箱/拆箱 for-each循环 可变参数 枚举 JDK 5.0 新特性简介 JDK 5.0 的一个重要主题就是通过新增一些特性来简化开发,这些特性包括 ...

  9. JDK5.0新特性(静态导入、自动装箱/拆箱、增强for循环、可变参数、枚举、泛形)

    JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效.清晰,安全的代码. 这些新特性主要有:1.静态导入2.自动装箱/拆箱3.增强for循环4.可变参数5.枚举6.泛型7 ...

  10. JDK5.0新特性1

    目录 静态导入 自动装箱/拆箱 for-each循环 可变参数 枚举 JDK 5.0 新特性简介 JDK 5.0 的一个重要主题就是通过新增一些特性来简化开发,这些特性包括: 静态导入 自动装箱/拆箱 ...

随机推荐

  1. 【Java安全】关于Java中常用加密/解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...

  2. 虚拟机中Ubuntu安装及基本功能设置

    虚拟机下安装ubuntu 虚拟机使用VMware14 PRO,在TOSHIBA EXT/Anon Comm Group\Experimental Environment\VMware下. 系统使用ub ...

  3. MySQL学习-预备知识

    开始今日份整理 1. 数据库介绍 1.1 数据库定义 数据库是一个由一批分明别类的数据构成的有序集合,这个集合通常被保存为一个或多彼此相关的文件,我们可以理解为,数据库就是一种特殊的文件,其中存储着我 ...

  4. docker--docker compose 编排工具

    11 docker compose 编排工具 11.1 docker compose 介绍 根据前面所学的知识可知,想要使用Docker部署应用,就要先在应用中编写Dockerfile 文件来构建镜像 ...

  5. 第八周zuoye

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/homew ...

  6. mysql定时任务/mysql作业

    转自:https://www.jb51.net/article/138569.htm 详细参考:https://www.cnblogs.com/qlqwjy/p/7954175.html(事件& ...

  7. Luogu p1241 括号序列

    括号序列题目连接 这是一道与dp毫无半点关系的题 本来是去找的题来着,结果并没有找到,然后看到了这道题. (本来以为会是很好写的一道题结果因为题意不清直接原地去世了) 思路很简单,基本没有技术含量. ...

  8. swtich和case语句中,定义变量要加花括号

    转自: http://blog.chinaunix.net/uid-27103408-id-3340702.html http://www.xuebuyuan.com/2070170.html swi ...

  9. tensorflow学习笔记七----------卷积神经网络

    卷积神经网络比神经网络稍微复杂一些,因为其多了一个卷积层(convolutional layer)和池化层(pooling layer). 使用mnist数据集,n个数据,每个数据的像素为28*28* ...

  10. Django @csrf_exempt不适用于基于通用视图的类(Django @csrf_exempt does not work on generic view based class)

    class ChromeLoginView(View): def get(self, request): return JsonResponse({'status': request.user.is_ ...