-
运行环境
JDK8+IntelliJ IDEA 2018.3 x64
-
问题
静态导入?
自动装箱/拆箱?
for-each循环?
可变参数?
枚举?
-
JDK 5.0 新特性简介
JDK 5.0 的一个重要主题就是通过新增一些特性来简化开发,这些特性包括:
静态导入、自动装箱/拆箱 for-each循环、可变参数、枚举、泛型、注解、使用这些特性有助于编写更加清晰,精悍,安全的代码。
-
静态导入
JDK5.0增加的静态导入语法用于导入指定类的某个静态属性值(方法)或全部静态属性值(方法) 静态导入语句使用 import static 语句
导入指定类的单个静态属性:import static java.lang.System.out
导入指定类全部静态属性:import static java.lang.Math.*
代码示例
1 package com.chenmengfan.demo1;
2
3 //导入System类的单个静态属性out
4 import static java.lang.System.out;
5 //导入Math类的所有静态成员
6 import static java.lang.Math.*;
7 //不推荐这样使用,这样会让性能变慢,除非该类的静态方法或属性被大量调用
8 //import static java.lang.Math.abs;
9 //import static java.lang.Math.PI;
10
11 /*
12 * 1.导入类的静态属性
13 * import java.lang.System 使用频率极高
14 * 2.没有显示导入
15 */
16
17 public class Demo1 {
18 public static void main(String[] args) {
19 out.println("hello");
20 out.println(abs(-1)); //绝对值
21 out.println(PI); //打印圆周率 Math
22
23 //当前类中若用到某一个类的静态方法或静态属性特别多,可用类名 *
24 }
25 }
运行效果
hello
1
3.141592653589793
-
自动装箱/拆箱
自动装箱(autoboxing):把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 变量 自动拆箱:把包装类对象直接赋给一个对应的基本类型变量
基本数据类型的自动拆箱与装箱
代码示例
1 package com.chenmengfan.demo2;
2
3 public class Demo2 {
4 public static void main(String[] args) {
5 Integer integer1 = 400;
6 Integer integer2 = 400;//自动装箱
7
8 System.out.println(integer1.equals(integer2));
9 System.out.println(integer1 == integer2);
10
11 // == 比较的是 是否是同一个对象
12
13 // 不是每一个equals都是比较值 String
14 // equals 是object equals 就是 ==
15 // 所有除非该类重写了equals 否则equals== "=="
16
17 int a = 400;
18 int b = 400;
19
20 System.out.println(a == b);
21
22 Integer integer3 = -128;
23 Integer integer4 = -128;
24
25 System.out.println(integer3.equals(integer4));
26 System.out.println(integer3 == integer4);
27
28
29 }
30 }
运行效果
true
false
true
true
true
-
for-each循环
使用foreach循环遍历数组和集合元素时, 无须获得数组和集合长度, 无须根据索引来访问数组元素和集合元素,
forearch 循环自动遍历数组和集合的每个元素
语法格式:
for(type varName : array | collection){
//varName 自动迭代访问每一个元素
}
代码示例
1 package com.chenmengfan.demo3;
2
3 import java.util.ArrayList;
4 import java.util.HashSet;
5 import java.util.List;
6 import java.util.Set;
7
8 /*
9 * 增强型for循环,不是基于index下标去遍历的,可用Set来证明.
10 * */
11 public class Demo3 {
12 public static void main(String[] args) {
13 // 集合第一次用增强型for循环 迭代器专门为集合打造的
14 List list1 = new ArrayList(); // 集合 array长度可变的数组
15 list1.add(1);
16 list1.add(2);
17 list1.add(3);
18 list1.add(4);
19 list1.add(5);
20 list1.add(6);
21
22 for (int i = 0;i<list1.size();i++){
23 System.out.println("i:"+list1.get(i));
24 }
25
26 /*
27 * 相比传统的for循环,增强型for循环代码简洁
28 * */
29
30 for (Object i : list1) {
31 System.out.println(i);
32 }
33
34 //集合 Set 无序(无下标) 迭代器 增强型for
35
36 Set set = new HashSet();
37 set.add("a");
38 set.add("b");
39 set.add("c");
40
41 for (Object o : set) {
42 System.out.println(o);
43 }
44 }
45 }
运行效果
i:1
i:2
i:3
i:4
i:5
i:6
1
2
3
4
5
6
a
b
c
-
可变参数
- 从JDK5.0 开始, Java 允许定义形参长度可变的参数,从而允许为方法指定数量不确定的形参。
- 若在定义方法时, 在最后一个形参的类型后增加三点(…), 则表明该形参可以接受多个参数值, 多个参数值被当成数组传入。
- 可变形参只能处于形参列表的最后, 所以一个方法最多只能有一个长度可变的形参。
- 调用包含一个可变形参的方法时, 可以为该形参传入多个参数或一个数组。
代码示例
1 package com.chenmengfan.demo4;
2
3 /**
4 * 定义可变长度参数时:两个注意
5 * 1.可变长度的参数必须置于形参列表的最后
6 * 2.可变长度的参数在形参列表中只能出现一个
7 */
8 public class Demo4 {
9 public static void main(String[] args) {
10 Demo4.fun("aa");
11 Demo4.fun("bb",1);
12 Demo4.fun("cc",1,2,3);
13 int[] arr = new int[]{10,20,30};
14 Demo4.fun("dd",arr);
15 }
16
17 public static void fun(String s,int...x){
18 System.out.println("---------");
19 System.out.println(x.length);
20 for (int i : x){
21 System.out.println(i);
22 }
23 }
24 }
运行效果
---------
0
---------
1
1
---------
3
1
2
3
---------
3
10
20
30
-
枚举类
在某些情况下, 一个类的对象是有限而且固定的(例如:季节类, 行星类), 这种实例有限而且固定的类, 在Java中被称为枚举类。
枚举类入门
JDK5 新增的enum关键字用于定义枚举类。
枚举类和普通类的区别:
- 使用 enum 定义的枚举类默认继承了java.lang.Enum类。
- 枚举类的构造器只能使用private访问控制符。
- 枚举类的所有实例必须在枚举类中显示列出(”,”分隔,”;”结尾). 列出的事例系统会自动添加 public static final 修饰。
- 所有的枚举类都提供了一个values方法, 该方法可以很方便地遍历所有的枚举值。
JDK5.0 中可以在 switch 表达式中使用枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定。
实现接口的枚举类
和普通Java类一样枚举类可以实现一个或多个接口。
若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 则可以让每个枚举值分别来实现该方法。
-
总结
在-128 ~ 127 这个范围内直接赋值int数值,Integer不会new 对象。
日拱一卒,不期速成。