第九题:半斤
public static void main(String[] args) {
short x = 0;
int i = 123456;
System.out.println(ChapterUtil.getFromInt(i));
x+=i;
System.out.println(x);
System.out.println(0xffffe240);
}
//控制台打印:
//1e240
//-7616
//-7616
类似+=复合赋值操作符,E1 op= E2 等价于 E1 = (T)((E1)op(E2)),其中T是E1的类型。上面的例子中,当进行加法时,会将操作数提升为int,得到123456,然后会转化为short,截掉高位的1,剩下0xe240,这是short,但是输出语句没有输出short的,最后会将0xe240提升为int,由于short高位为1,是负数,用符号填充,及最终打印的是0xffffe240,十进制为-7616.
第十题:八两
public static void main(String[] args) {
Object x = "Buy ";
String s = "Effective Java";
x+=s;
System.out.println(x);
}
+=的左侧是String类型的话,右侧可以是任意类型,将String类型变量放入Object中,这是可行的。
第十一题:最后的笑声
public static void main(String[] args) {
System.out.println("H"+"a");
System.out.println('H'+'a');
}
//控制台输出:
//Ha
//169
“H”+”a”是字符串连接,所以打印出字符串;’H’+’a’是字符相加,会扩宽为int相加,char转为int,以0填充,所以最后是72+97,最后得到169。
如果想用char连接起来,可以加一个空白的字符串“”,字符串与任意类型相加都会转成字符串。
第十二题:ABC
public static void main(String[] args) {
String letters = "ABC";
char [] numbers = {'1','2','3'};
System.out.println(letters + "easy as " + numbers);
}
//控制台打印:
//ABCeasy as [C@70dea4e
这题的关键是char数组的toString方法是从Object继承过来,在我的一篇博客里,介绍了Object是数组的getName方法,toString方法与getName相关,jdk源码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
根据上面提及的那篇博客,char数组的getClass().getName()就是[C,最终打印[C@70dea4e。
解决的方法有:String.valueOf(numbers)将char数组转成一个字符串,然后拼接。等等。
得到的经验教训是数组类型都应该覆盖toString方法。