1、静态导入。平常我们导入java中的包都是使用普通的格式,即:import java.util.*;这种格式,但是在使用导入的包中类的静态方法时,还是必须要通过类名调用。在jdk1.5版本中,java可以通过静态导入的方式,省略写类名,直接调用该类的静态方法。但是在导入包的时候要注意,静态导入的时候一定要将类名写出来。例如
package cn.itcast.day1;
import static java.lang.Math.*;
public class StaticImport {
public static void main(String[] args){
System.out.println(max(3, 6));
System.out.println(abs(3 - 6));
}
}
如果在导入包的时候没有写Math类名的话,这个静态导入是使用不了的。还有一个要注意的地方。你需要使用的方法在 别的导入的包中没有重名方法,也就是说你要使用的这个方法在你的这个类中是唯一的才可以省略写类名,而直接调用方法。
2、增强for循环:语法格式:for(type变量名:集合变量名){...}这个for只能用在数组或者集合中,其他的不适合。
package cn.itcast.day1;
public class ForTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[]{1,5,7,9,2,5};
for (int i : arr) {
System.out.println(i);
}
}
}
这样写就比写for循环简单很多。
3、可变参数,可变参数是只在参数列表中参数不固定,根据需要传参数,但是要注意一点,可变参数只能放到参数列表的最后面,即前面几个参数确定了的话,后面的都是属于传递的可变参数。格式int add(int x,int... args)。鸡蛋壳.4的时候如果要传的参数不固定,只能将参数封装成数组,在传递给函数,而现在是jdk自动将可变参数封装成了数组。例如:
public class VarableParameter {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(add(1, 2, 3, 4, 5));
}
public static int add(int x,int... args){
int sum = x;
/*for (int i = 0; i < args.length; i++) {
sum = sum + args[i];
}
*/
for (int i : args) {
sum += i;
}
return sum;
}
}
如果不是java自动将后面可变参数封装成了数组,增强for循环也就根本使用不了。
4、基本类型的自动拆箱与装箱。
在jdk1.4的时候,要将一个int数给一个Integer对象是要调用Integer构造方法才能赋值的,在1.5版本以后,可以直接将一个int数复制给一个Integer对象,因为在java中自动将int数进行封装成对象,然后赋给Integer对象。例如:
Integer i = 127;
Integer i2 = 127;
不需要像1.5版本以前这样写:
Integer i = new Integer(127);
拆箱也是一样的,可以直接将一个Integer对象直接赋值给int型数据。这个就是自动拆箱:
int num = i;
5、享元模式:运用共享技术有效地支持大量细粒度的对象。Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象。例如:
public class AutoBox {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1 = new String("abc");
String str2 = new String("abc");
String str3 = "abc";
String str4 = "abc";
System.err.println(str1==str2);
System.err.println(str3==str4);
System.err.println(str1==str4);
Integer i = 127;
Integer i2 = 127;
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i==i2);
System.out.println(i3==i4);
Integer i5 = Integer.valueOf(127);
Integer i6 = Integer.valueOf(127);
System.out.println(i5==i6);
}
}
其中打印输出的结果分别是false
true
false
true
false
true
第一个结果是false很好理解,因为是new了两个对象,所以判断地址是否相等肯定为假,那第二个结果为真就是因为java中采用了享元模式了,在java中String类型的对象,还有Integer对象中不超过一个1字节的数组,都是采用的向原模式,只要不是采用new的方式产生的对象,都是属于共享一个对象。所以其中i3==i4的结果是false,也就能理解了,因为128在int型数据中不只占用了一个字节,而是占了两个字节。