使用Java中的final关键字将类型从整数转换为字节 - java

public static void main(String[] args) {

    final int a =15;
    byte b = a;
    System.out.println(a);
    System.out.println(b);
}

在上面的代码中,当我从int转换为byte时,它没有给出编译时错误,但是当我从long转换为int时,却给出了编译时错误,为什么?

public static void main(String[] args) {

    final long a =15;
    int b = a; 
    System.out.println(a);
    System.out.println(b);
}

参考方案

从the JLS section on assignment conversions:

另外,如果该表达式是byteshortcharint类型的常量表达式:

  • 如果变量的类型是byteshortchar,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄基元转换。
  • 当您声明和初始化final a时,这是一个编译时常量表达式,编译器可以确定15值将安全地适合byte。 JLS根本不允许未经声明就从long进行隐式变窄转换,并且该规则至少可以追溯到Java 2(我可以在任何地方找到的最早的JLS)。

    我推测这种理由可能源于Java字节码是为32位字长定义的,并且对long的操作在逻辑上更加复杂和昂贵。

    System.out.println-此方法是否在Java中链接? - java

    我想知道下面的Java代码:“ System.out.println”。我对此是正确的:“系统”是静态类。 “ .out”是“系统”类的方法。这是我对“ .println”有点困惑的地方-这是一个什么类/对象的方法?另外,这个概念被称为“方法链接”吗?谢谢GF 参考方案 不,这不是方法链接。您正确地认为System是一个类(只是一个常规类,不是“静态”,只有…

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

    JAVA:字节码和二进制有什么区别? - java

    java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

    System.out.printf不打印整数参数 - java

    我是Java编程的新手,无法从另一个类返回方法。这两个类都可以编译并成功运行。我可以从一个类中调用一个简单的int,但是当我想计算用户输入的两个输入整数时,我只会得到一个空格。这是我的计算课class calculations { public final int AGE = 53; public int numbers(int num1, int num2…

    System.out.println(true)和System.out.println(“ true”)之间的区别 - java

    之间有什么区别System.out.println(true); 和System.out.println("true"); 尽管我看到的输出是相同的,但是在用法或编码样式方面有什么不同吗? 参考方案 在第一个选项中,您将boolean传递给PrintWriter的println方法,而在第二个选项中,您传递的是String,因此调用了不同…