《java解惑》笔记三

第九题:半斤

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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aabond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值