黑马程序员--java基础加强之JDK1.5新特性
一、静态导入 :import static...
1.5以前如果调用一些类的静态方法,需要用类名.静态方法来调用
1.5以后可以直接静态导入类,直接调用其中的方法就可以了,不用写类名
事例需求:计算两个数的最大值和相减结果的绝对值。
1
2
3
4
5
6
7
8
9
10
|
package lann.Day1; import static java.lang.Math.*; public class StaticImport { public static void main(String[] args) { //比较两个数的最大值并打印,需要调用Math类中的静态方法 //1.5版本前是用Math.max(int x,int y)来完成的,出现静态导入后可以省略前面的Math了 System.out.println(max( 3 , 6 )); System.out.println(abs( 3 - 6 )); } } |
二、基本数据类型的自动装箱和拆箱
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package lann.Day1; public class AutoBox { public static void main(String[] args) { //1.5之前需要new Integer(3),1.5之后不需要了; Integer iobj = 3 ; //自动装箱 //自动拆箱,因为iobj是对象引用,不能进行加法计算,所以会将对象自动转成基本数据类型 System.out.println(iobj + 3 ); //小例子,判断2个变量是否相等; Integer i1 = 3 ; Integer i2 = 3 ; System.out.println(i1 == i2); //结果为true,说明并没有在堆内存中开辟2个空间 //另一个类似的例子 Integer i3 = 129 ; Integer i4 = 129 ; System.out.println(i3 == i4); //结果为false,说明开辟了新的空间 //总结:将一个数据封装成对象时,如果数据大小在一个字节内,也就是-127~128之间时,不会在堆内存中开辟新的空间,而是暂时存储到缓冲池中,再调用该数字时先在缓冲池中查找。 //因为对于一些小数据使用频率是很高的,如果每次都开辟空间的话对资源是一种浪费,为了尽可能的减少使用内存的次数,有了这种设计模式,叫做享元模式; //享元模式:如果很多小的对象,他们有很多相同的属性,可以将这些相同的属性封装成一个对象,称为内部状态,对于那些不同的属性,把他们作为方法的参数传入,称为方法的外部状态 } } |
三、可变参数
在我们写程序时,会经常遇到某个方法需要传入很多参数,参数的个数不确定, 比如,计算几个数的和,但不确定几个数。
以往的思路是创建一个方法,然后通过重载来实现对应参数数的方法,比较麻烦,所以1.5以后出现可变参数。
特点:1、只能出现在参数列表的最后,后面不能再定义新的参数;
2、...位于参数类型和变量名之间;
3、调用可变参数方法是,编译器会为参数隐性创建一个数组,在方法体中以数组形式访问可变参数。
四、for循环增强
需求:写一个求和的方法,要求传入可变参数,并用到增强for循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package lann.Day1; public class VeriableParameter { public static void main(String[] args) { System.out.println(add( 1 , 3 , 54 , 6 , 71 , 8 , 23 , 4 )); System.out.println(add( 12 , 33 , 52 , 6 , 72 , 8 , 23 , 4 )); } //定义一个求和的方法 public static int add( int x, int ... args){ int sum = 0 ; //for循环增强 for ( int i : args) { sum += i; } System.out.println(sum); //普通for循环 /*for (int i = 0; i < args.length; i++) { sum += args[i]; }*/ return sum; } } |
五、枚举
枚举的作用:枚举就是用来让某个变量的值只能是几个固定的值中的一个。
枚举可以让程序在编译时就能够控制非法值的出现。
实例:定义一个星期天的枚举类和交通灯的枚举类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
package lann.Day1; public class EnumTest { public static void main(String[] args) { //获取WeekDay对象 WeekDay weekDay = WeekDay.SUN; //获取名字 System.out.println(weekDay.name()); //获取该元素在类中的第几位 System.out.println(weekDay.ordinal()); //获取该元素所在的类 System.out.println(weekDay.getClass()); //获取所有元素,返回一个数组 System.out.println(WeekDay.values().length); //字符串转换成元素所在类的对象 System.out.println(WeekDay.valueOf( "SUN" )); } //类只能用public和默认的修饰符,但是类如果放到成员的位置上,就可以用成员的修饰符 public enum WeekDay{ //元素列表必须放到第一行,元素后面不加括弧时默认用无参数构造方法,加上括弧并传入参数则执行相对应的构造方法 SUN( 1 ),MON,TUE,WED,THI,FRI,SAT; //定义一个无参数构造方法 private WeekDay(){} //定义一个有参数构造方法 private WeekDay( int day){} } //实例二:交通灯,比较复杂的枚举 public enum TrafficLamp{ //定义三个灯元素,代表该类的对象。每个对象后面()代表调用该类的构造方法,{}是内部类,代表该类的子类,复写该类的抽象方法 RED( 30 ){ public TrafficLamp nextLamp(){ return GREEN; } }, GREEN( 45 ){ public TrafficLamp nextLamp(){ return YELLOW; } }, YELLOW( 10 ){ public TrafficLamp nextLamp(){ return RED; } }; private int time; private TrafficLamp( int time){ this .time = time; } public abstract TrafficLamp nextLamp(); } } |