编译后的Java字符

编译后的Java字符,java,io,Java,Io,刚刚了解了.class文件的这种行为 假设我有这个代码: public class Demo { public static void main(String...args) { char ch = 'A'; } } import java.io.PrintStream; public class Demo { public Demo() { } public static transient void main(S

刚刚了解了.class文件的这种行为

假设我有这个代码:

public class Demo
{
    public static void main(String...args)
    {
        char ch = 'A';
    }
}
import java.io.PrintStream;

public class Demo
{

    public Demo()
    {
    }

    public static transient void main(String args[])
    {
        char c = 'A';
        System.out.println(c);
    }
}
如果我编译文件并使用cavaj反编译器打开.class文件,它会显示如下内容:

public class Demo
{

    public Demo()
    {
    }

    public static transient void main(String args[])
    {
        byte byte0 = 65;
    }
}
这里,char被写为byte。但如果我打印这个字符并编写如下代码:

public class Demo
{
    public static void main(String...args)
    {
        char ch = 'A';
        System.out.println(ch);
    }
}
反编译后,我得到以下代码:

public class Demo
{
    public static void main(String...args)
    {
        char ch = 'A';
    }
}
import java.io.PrintStream;

public class Demo
{

    public Demo()
    {
    }

    public static transient void main(String args[])
    {
        char c = 'A';
        System.out.println(c);
    }
}
我想知道两件事。首先,为什么编译器已显式导入PrintStream类。其次,为什么“char”被写为“char”,而不是像前面的例子中那样写为“byte”,或者打印字符如何改变行为


提前感谢:

嗯,编译器不编写导入语句。编译器显式导入PrintStream类的原因是什么?导入是一个仅源代码的概念。我的意思是,为什么这个语句在反编译时可见?这是反编译器的问题,而不是编译器的问题。它可能注意到您正在调用PrintStream上的一个方法,该方法的类型为System.out.ok。我很清楚这个原因。但是“char”“byte”这个词呢?说到底,听起来你真的只是对反编译器的功能感兴趣。使用javap-c查看字节码是什么。