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对象
三、增强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)
JDK5的新特性的更多相关文章
- Java基础和JDK5.0新特性
Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...
- Javaweb学习笔记——(七)——————myexlipse基本使用、jdk5.0新特性及反射讲解
1.debug调试模式: *使用这种模式,调试程序(看到程序运行停止在这一行) -显示出来行号 -双击左边,出现一个圆点,表示设置了一个断点 *使用debug as方式,运行程序 -特使是否进入到调试 ...
- JDK5的新特性之 增强for
package cn.itcast.day19.foreach; import java.util.ArrayList; import java.util.Collection; import j ...
- Day07 jdk5.0新特性&Junit&反射
day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装M ...
- JDK5的新特性:泛型、可变参数、静态导入
数组可以在创建的时候就指定存放的数据类型,这样放入不同类型的时候就会发生编译错误. 而集合却可以存储多种不同类型,这样的话如果是遍历的时候在集合中装了好多不同的数据类型的时候,十分容易发生类型转换错误 ...
- Java JDK5.0新特性
JDK5.0新特性 虽然JDK已经到了1.8 但是1.5(5.0)的变化是最大的 1. 增强for循环 foreach语句 foreach简化了迭代器 作用: 对存储对象的容器进行迭代 (数组, co ...
- JavaSE 学习笔记之Jdk5.0新特性(十九)
Jdk5.0新特性: Collection在jdk1.5以后,有了一个父接口Iterable,这个接口的出现的将iterator方法进行抽取,提高了扩展性. --------------------- ...
- JDK5.0新特性 (Day_07)
JDK5.0新特性 目录 静态导入 自动装箱/拆箱 for-each循环 可变参数 枚举 JDK 5.0 新特性简介 JDK 5.0 的一个重要主题就是通过新增一些特性来简化开发,这些特性包括 ...
- JDK5.0新特性(静态导入、自动装箱/拆箱、增强for循环、可变参数、枚举、泛形)
JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效.清晰,安全的代码. 这些新特性主要有:1.静态导入2.自动装箱/拆箱3.增强for循环4.可变参数5.枚举6.泛型7 ...
- JDK5.0新特性1
目录 静态导入 自动装箱/拆箱 for-each循环 可变参数 枚举 JDK 5.0 新特性简介 JDK 5.0 的一个重要主题就是通过新增一些特性来简化开发,这些特性包括: 静态导入 自动装箱/拆箱 ...
随机推荐
- 那些堪称神器的 Chrome 插件
Chrome 的简洁快速以及丰富的插件种类使得它在国内日益盛行,帮助了我们很多 Chrome 用户提升了工作效率,而今天要给大家推荐8款实用甚至堪称神器的 Chrome 插件,希望对提升大家的工作效率 ...
- 六、Zabbix-自动分组
一.配置Zabbix server 1.创建主机组 (2)配置—>主机群组—>创建主机群组 (2)Next Step (3)可以看到新添加的主机组 2.添加自动分组动作 配置—>动作 ...
- 开篇——从程序员到IT经理
2002年~2005年我在广州的广东水力电力职业技术学院求学,主修网络工程.求学期间,我从事最多的就是玩游戏,当时就是玩MU和CS,所以有一门编程课叫C语言的“肥佬”(广东话)了,要补考,没办法,于是 ...
- Zend_Cache的使用
一.Zend_Cache快速浏览 Zend_Cache 提供了一个缓存任何数据的一般方法. 在Zend Framework中缓存由前端操作,同时通过后端适配器(File, Sqlite, Memcac ...
- AcWing 875. 快速幂
题目链接:https://www.acwing.com/problem/content/description/877/ 快速幂模板题,计算ab mod p 的值,a,b,p大概1e9左右,可以快速计 ...
- QT linux下显示中文的问题
如果中文显示为乱码,那么是字符集不对. 应该设置字符集: QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK") ...
- Tomcat控制台中文乱码
参考:https://blog.csdn.net/zhaoxny/article/details/79926333 1.找到${CATALINA_HOME}/conf/logging.properti ...
- python 生成list的所有的子集 (不使用递归且不引入标准库)
不使用递归且不引入标准库,单纯用两个for循环即可得出一个list的所有子集 L = [1, 2, 3, 4] List = [[]] for i in range(len(L)): ...
- Proxy does not work using sudo in Debian
To resolve this issue you can add Defaults env_keep += "http_proxy https_proxy" to your /e ...
- 小a的轰炸游戏(差分,前缀和)
题目传送门 题意: 给出一个n*m的矩形,然后有两个操作. 1操作,对一个给出的菱形,对菱形范围内的东西进行+1. 2操作,对一个上半菱形的区域,进行+1操作. 最后求矩形内各个数的异或和. 思路: ...