小编典典

切换案例Java中的编译时间常数用法

java

使用规则如下case

  1. case表达式必须计算为Compile Time Constant

  2. case(t)表达式必须与switch(t)具有相同的类型,其中t是类型(字符串)。

如果我运行此代码:

public static void main(String[] args) {
    final String s=new String("abc");
    switch(s)
    {
       case (s):System.out.println("hi");
    }

}

它给出Compile-error为:"case expression must be a constant expression"
另一方面,如果我尝试使用final String s="abc";,它可以正常工作。

据我所知,String s=new String("abc") 是对String位于堆上的对象的引用。并且s它本身是一个编译时常量。

这是否意味着final String s=new String("abc");不是编译时间常数?


阅读 212

收藏
2020-10-16

共1个答案

小编典典

用这个,

    String s= new String("abc");
    final String lm = "abc";

    switch(s)
    {
       case lm:
           case "abc": //This is more precise as per the comments
           System.out.println("hi");
           break;
    }

根据文档

基本类型或String类型的变量是最终变量,并使用编译时常量表达式(第15.28节)进行了初始化,该变量称为常量变量

问题是您的代码final String s= new String("abc");未初始化常量变量。

2020-10-16