1
autoboxing 和autounboxing是指Java的对象和primitive间的转换,Java的primitive是指int,short,char等,基本不是对象的类型,而Integer,Short,Character是primitive的wrapper,是封装类.
这里有一个要注意的是NUll,因为NULL对一个对象来说是合法的,但对primitive来说不是,所以在程序中要注意不要装wrapper的NULL直接给primitive,它会Throw NullPointerExcpetion.
2 == & equals
// 如果i值介于 -127和127之间,则==是相等的,否则是不等的,equals方法是一直相等的.
//-127至127之间的值是不可变的wrapper
Integer i1 = 561;
Integer i2 = 561;
if(i1 == i2)
System.out.println("== True");
else
System.out.println("== false");
if(i1.equals(i2))
System.out.println("Equals true");
else
System.out.println("Equals false");
i1 = 123;
i2 = 123;
if(i1 == i2)
System.out.println("== True");
else
System.out.println("== false");
if(i1.equals(i2))
System.out.println("Equals true");
else
System.out.println("Equals false");
}
3 Conditional 与 unboxing
Conditional 是三元运算符: [conditional expression]?[expression1]:[expression2],true时,执行前者,否则执行后者.
这里两个结果条件表达式只要有一个被unbox即可以正常运行.
int a = 3;
double b = 2.3;
double re = ((a > b)? a :b);
System.out.println(re);
返回结果是3.0,而a,b的类型是不一样的,在以前的1.4版本中是不允许的.
因为int 和double有一个交集 double.
unboxing还为Switch引入一些新的值,Tiger之前只接收int,short,byte,character,现在有了unboxing,还可以引入enum,以及Integer,Short,Char,Byte
4 Tiger中method的解析步骤(三步):
A 编译器会试着不用任何的boxing/unboxing,或启用vararg来定位正确的method,这会找到根据Tiger以前的规则调用的任何方法
B 如果第一步失败,则会尝试解析method,但这次会允许boxing/unboxing的转换,具有vararg的method不在这次中解析.
C 如果第二步也失败,则会最后一次尝试允许boxing/unboxing,并且考虑vararg的method
这样的规则可以确保维持与Tiger之前的环境一致性.
例如:
public void done(double n);
public void done(Integer n);
假设你现在调用done 方法,int foo = 100;done(foo);
根据上述三个规则,首先int会被扩展成double并调用done(double n)方法.(这也是Tiger之前的规则),而不是首先调用boxing/unboxing来破坏一致性.不然调用时调用的方法不准确会导致不可预知的问题.
5 vararg == variable argument
vararg 允许你指定可以采用多个同类型参数的method,而不需要事先确定(于编译或运行时)参数的数目.它的表现形式是...,这三个小点点是vararg的关键.下面是使用vararg来允许未知参数的String零件的Guitar的constructor版本.
public Guitar(String builder,String model,String... features);
此处String...参数指出可提供任意数量的String参数.
当你指定了一个可变长度的参数list的时候,Java编译器基本上把它读作 创建一个<argument type>类型的array.你输入的是String... features,而编译器读到却是String[] features,这意味着iterate参数的list会很简单,你对vararg可以像对待array的操作那样.不过它还是有一些限制.这三个小点点只能在一个method中使用且出现在method中的最后一个位置,出现多个就是错误的,不合法的.
Java编辑器将String...视为array,String...的参数是从0到n个
public static int max(int... is){
if(is.length == 0){
throw new IllegalArgumentException("No Values Supplied");
}
int max = Integer.MIN_VALUE;
System.out.println(max);
for(int i : is){
if(i >max)
max = i;
}
System.out.println(max);
return max;
}
public static void main(String[] args) {
max(111,3,5,6,444,5);
}
避免自动化的Array转换
如上例中我们可以把String...换为更为广泛通用的Object...类型,你可以接收更多的参数.大部分的都会由Tiger来自动转换.不过有个特例
//Java.io.PrintStream的printf(String format,Object... objs);
Object[] objs = new String[]{"JavaEye","is","very","good","network station"};
System.out.printf("%s",objs);
上面这一切看起来很正常,但是运行起来以后会打印出Java,而不是一个Object对象.
这里是因为编译器将objs array当作一个对象来看,把array分离成多个对象,第一个参数变成了 String类型的"Java",当把它传给printf的%s时它就会把Java打印出来.
由于你想得到Object对象,所以你要告诉编译器你想要整个对象的array,将它当作一个对象来用.而不是一组参数来用.
所以我们用new Object[]{objs}或(Object)objs来转换一下,此时打印出来的就会是对象的形式.