一,可变参数
1,什么是可变参数:当一个方法的参数的类型确定而参数个数不确定时,可以在形参的“类型”与“参数名”之间加上三个连续的“.”(即“...”,英文里的句中省略号),让它和不确定个数的实参相匹配。一个带有这样的形参的方法,就是一个实参个数可变的方法。
例如:public void write(Object ...objs)
2,可变参数的特点:
a,只能出现在参数列表的最后;
b,...位于变量类型和变量名之间,前后有无空格都可以;
c,调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
二,增强for循环
1,语法:
for ( type 变量名:集合变量名 ) { … }
2,注意事项:
a,迭代变量必须在( )中定义!
b,集合变量可以是数组或实现了Iterable接口的集合类
3,举例:
public static int add(int x,int ...args) {
int sum = x;
for(int arg:args) {
sum += arg;
}
return sum;
}
三,基本类型的自动拆箱与装箱
1,当我们要创建一个基本数据类型的时候,按照Java默认的语法,需要使用new关键字来创建一个对象。在Java1.5之前对于基本数据类型的包装类只能使用new关键字,但是在Java1.5及以后给我们提供了一个基本数据类型的自动装箱和拆箱功能,可以不使用new关键字。
2,示例代码:
自动装箱:Integer num1 = 12;
自动拆箱:System.out.println(num1 + 12);
3,享元模式(flyweight pattern):
有很多细粒度的对象,它们之间存在相同属性和不同属性。将它们的相同属性封装成一个对象,存储在内存中,下一次要用到这些相同属性时,直接将内存中存储的这个对象返回给调用者而不需要重复创建,将不同属性作为方法的参数传入。相同属性称为这个对象的内蕴状态,不同属性称为这个对象的外蕴状态。
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2);//结果为true
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4); //结果为false
Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12);
System.out.println(num5 == num6);//结果为true
在Java中对于-127到128之间的数,因为数据比较小,而且使用的比较频繁,在内存中
就保存一份,这样的设计模式就属于享元模式。
4,享元模式的应用条件:
1)一个系统有大量的对象。
2)这些对象耗费大量的内存。
3)这些对象的状态中的大部分都可以外部化。
4)这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一组都可以仅用一个对象代替。
5) 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。
四,枚举
1,什么是枚举?
在实际应用中,有的变量只有几种可能的取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 Java语言中对这样取值比较特殊的变量可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。
定义一个变量是枚举类型,可以使用关键字enum定义一个枚举类,然后再说明这个变量是枚举类型。
例如:
enum weekday{sun,mon,tue,wed,thu,fri,sat};
定义了一个枚举类型名 enum weekday,然后定义变量为该枚举类型。例如:
enum weekday day;
当然,也可以直接定义枚举类型变量。例如:
enum weekday{sun,mon,tue,wed,thu,fri,sat} day;
其中,sum,mon,…,sat 等称为枚举元素或枚举常量,它们是用户定义的标识符。
2,使用枚举时该注意的地方:
a,枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
b,枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
c,带构造方法的枚举,构造方法必须定义成private。
d,枚举只有一个成员时,可以作为一种单例的实现方式。