top

作业代码反编译后的疑惑

JDK学习笔记第四章的选择题 第2题
解题部分没有什么问题,自动装箱和自动拆箱分别出现。

但是当把文档反编译的时候,问题出现了。反编译内容如下:
import java.io.PrintStream;

public class Exercise2
{

    public Exercise2()
    {
    }

    public static void main(String args[])
    {
        char c = '\310';
        char c1 = '\310';
        Integer integer = Integer.valueOf(c);
        Integer integer1 = Integer.valueOf(c1);
        System.out.println(c == integer.intValue());
        System.out.println(c1 == integer1.intValue());
    }
}

问题出现在给变量赋初值的地方。
int x = 200;
int y = 200;
竟然变成了:
char c = '\310';
char c1 = '\310';
得知该方法是以八进制的方式来表示数字。
尝试了,可以从 0 - 377进行表示,即 0 - 255的256个数字。

可是奇怪的是:
1、属于基本类型char的c和c1竟然可以和进行加减计算,而且可以和int做比较是否相等。请问老师,这是为何?
2、为什么print c和c1都会显示成?,除了将其转型外,还有其它方式可以print出来么?
3、char类型的变量究竟可以放多少东西?除了unicode和八进制以外,还能放别的么?

麻烦老师帮小弟解惑,谢谢

編譯器最佳化的東西,不用去理會它,也不要在語法裏頭特定用這些,你自己做這類事情不會比較快,程式碼只會更難懂 ...

char 本來就可以指定整數值給他 ...
  1. char c = 65; // 指定 ASCII 的 65 編碼十進位數字
  2. System.out.println(c); // A
複製程式碼
char 有兩位元組長度,所以你覺得他可以放到多少呢?可以用十進位指定,那可以可不可以用八進位呢?可不可以用 16 進位呢?

TOP

編譯器最佳化的東西,不用去理會它,也不要在語法裏頭特定用這些,你自己做這類事情不會比較快,程式碼只會 ...
caterpillar 發表於 2013-12-30 10:14


有尝试过
char c = '\u012C';
同样可以通过八进位和十六进位来赋值。
之所以很惊讶是因为char不但可以拿来存放数字,更能够进行计算。

比如改变一下老师您的例子,
char c = 'A';
System.out.print(c+0); 会显示成65
System.out.print((char)(c+0)); 则会显示成A
看起来又回到了之前 数值自动提升类型 的问题上了。
与int做运算,char会被提升到int。

还有一个有趣的是:
        char ca = 'A';
        Integer ii = ca+1;
        System.out.println(ii);
看似牛头不对马嘴的代码,在自动提升和自动装箱的配合下,也能够顺利执行完毕。哈哈。

TOP