静态导入
一般情况下import是导入一个类或某个包中的所有类,而静态导入是import static 导入的类名或者类名的某个静态方法。
其作用是简化书写,在调用该类的静态方法时可以不用再写类名,前提是方法名没有重复。
//静态导入
public class StaticImport {
public static void main(String[] arg)
{
System.out.println(max(5, 5));
System.out.println(abs(5 - 5));
}
}
注:
1.当导入的两个类中有同名成员时,需要在成员前加上相应的类名。
2. 当类名重名时,需要指定具体的包名。当方法重名时,指定具体所属的对象或者类。
可变参数
如果一个方法在参数列表中传入多个参数,个数不确定,那么每次都要复写该方法。这时可以用数组作为形式参数。但是在传入
时,每次都需要定义一个数组对象,作为实际参数。在JDK1.5版本后,就提供了一个新特性:可变参数。
格式如下:
public static int add(int x,int ...args)
例子:
public class VariableParam {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(add(1, 2, 3, 4, 5, 6, 7, 8, 9,10));
}
public static int add(int x,int...args){
int sum=x;
for (int i = 0; i < args.length; i++) {
sum+=args[i];
}
return sum;
}
}
注:
1、可变参数只能出现参数列表最后
2、...位于变量类型与变量名之间,之间有无空格没影响
3、调用可变参数方法时,实际上是为该可变参数创建一个数组
增强for循环
语法:for ( type 变量名:集合变量名 ) { … }
对集合进行遍历,只能获取集合元素,但是不能对集合进行操作。
建议在遍历数组的时候,还是希望使用传统for。因为传统for可以定义角标。
注意:变量类型前可加修饰符,如final(可被局部内部类访问到)利用增强for循环改写add方法:
public static int add(int x,int...args){
int sum=x;
for (int arg : args) {
sum+=arg;
}
return sum;
拆装箱
1、自动装箱:
Integer num1=3;
2、自动拆箱:
num1+3;
3、对于基本数据类型的说明:整数在-128 ~ 127之间的数,包装成Integer类型对象,会存入常量池中的缓存,再创建一个对象的时候,如果其值在这个范围内,就会直接到常量池中寻找,因为这些小数值使用的频率很高,所以缓存到常量池中,被调用时就方便很多。
4、享元模式(flyweight):
有很多个小的对象,他们有很多相同的属性,把属性相同的部分变为同一个对象,这些属性称为内部状态。那些不同的属性,把他们变成方法的参数,称之为外部的状态。这种优化内存,只创建一个对象的模式,称之为享元模式。例如:Integer对象中对象取值范围在-128~127时,其值相同的对象想等,因为这些小的数被缓存在一个池中,被调用的频率较高,所以通常在池中取,从而导致对象相同。这就是典型的享元设计模式。//自动装箱 :Integer num1=new Integer(num1);
Integer num1=3;
//自动拆箱:Integer.valueOf(num1)+3
System.out.println(num1+3);
//当数值在-128~127时,对象会被重用
Integer i1=120;
Integer i2=120;
System.out.println(i1==i2); //true
//不在-128~127时,与其他对象一样都再new一个对象
Integer a1=200;
Integer a2=200;
System.out.println(a1==a2);//false
枚举
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标
<span style="font-size:12px;">public class EnumDemo {
public static void main(String[] args) {
WeekDay weekDay=WeekDay.MON;
System.out.println(weekDay);//输出枚举常量名
System.out.println(weekDay.name());//输出对象名
System.out.println(weekDay.getClass());//输出对应类
System.out.println(weekDay.toString());//输出枚举对象名
System.out.println(weekDay.ordinal());//输出此对象在枚举常量的次序
System.out.println(WeekDay.valueOf("WED"));//将字符串转化为枚举常量
System.out.println(WeekDay.values().length);//获取所有的枚举元素,并打印其长度
}
//定义枚举内部类
public enum WeekDay{
SUN(1),MON,TUE,WED,THI,FRI,SAT;//分号可有可无,但如果下面还有方法或其他成员时,分号不能省。
//而且当有其他方法时,必须在这些枚举变量的下方。
//无参构造器
private WeekDay(){
System.out.println("First");
}
//带参数的构造器
private WeekDay(int day){
System.out.println("Second");
}
}
} </span>