【问题标题】:Re-Initializing a Variable as a Constant将变量重新初始化为常量
【发布时间】:2014-11-06 16:03:55
【问题描述】:

我是 Java 新手。我想知道是否有办法在将声明的全局变量用作变量后将其重新初始化为常量......那是因为在对声明的变量进行了一些工作之后,我想在 Switch 案例中使用它声明...

class A {
    int x;
    int y;
    public static void main(String args[]) {
        A a = new A();

        System.out.println(a.x);
        a.y = 3;
        a.x = 5;
        switch (a.y) {
            case a.x:// Something
        }
    }
}

这是我需要的示例...打印语句提到,我需要对变量 x 做一些事情。稍后我想在 Switch case 语句中使用它。我不想在 switch case 语句后使用 x...请帮帮我...

【问题讨论】:

  • 我认为您不能在案例陈述中使用a.x 甚至a.getX()。它只接受常量。
  • 是的...这就是我想要做的...我想在 case 语句中使用 a.x...所以我想将它重新初始化为一个常量...我的问题是,有没有办法做到这一点?
  • 是的,不要使用switch-case,使用if-elseif-else
  • 你不能做int x;final吗?
  • 也需要静态...?

标签: java variables switch-statement constants


【解决方案1】:

我想知道是否有办法在将声明的全局变量用作变量后将其重新初始化为常量...

不,没有。 (Java 也没有全局变量;查看您的代码,xy实例数据成员。Java 最接近全局变量的是 public static [aka "class "] 公共类中的数据成员。)

那是因为在对声明的变量做了一些工作之后,我想在 Switch case 语句中使用它...

如果大小写值(a.x,在您的情况下)不是常量,则不能。相反,您必须使用if/else if/else

class A {
    int x;
    int y;
    public static void main(String args[]) {
        A a = new A();

        System.out.println(a.x);
        a.y = 3;

        if (a.y == a.x) {
            // ...
        }
        else if (a.y == something_else) {
            // ...
        }
        else {
            // ...
        }
    }
}

【讨论】:

  • "Java 也没有全局变量;" 静态变量不是全局的吗?
  • @whiletrue 不,它们不是,公共静态更接近,但它们仍然不是正确的全局且在任何地方都可用
  • @whiletrue: public static 类中的数据成员接近是全局的,如果它们所在的类是public
【解决方案2】:

不,答案是你不能在 Java 中做到这一点。

case 后面的“事物”必须是常量。
在 Java 7 或更高版本中,您还可以使用字符串作为大小写标签。

Switch statement Java

【讨论】:

    【解决方案3】:

    这是不可能的。要将某事用作switch 中的案例,它必须是编译时已知的常量。如果你想基于一个变量来设置它(即在运行时),在编译时是不可能知道的。

    【讨论】:

      【解决方案4】:

      您只能打开编译时常量。我认为你想要实现的目标可以用一个简单的 if 语句来完成。

      if (a.y == a.x) {
          // do stuff.
      }
      

      由于 Java 中的常量是编译时的,因此“重新初始化”作为一个概念没有意义。

      【讨论】:

      • 是的,但是我想通过使用 Switch-Case 语句来简化它。现在感觉做不到。
      【解决方案5】:

      在 Java 中,当您编写 switch 语句时,编译器必须能够在编译时告诉case 选项的值是什么。如果您想设置switch,其中case 选项之一将是在运行时确定的值——抱歉,您不能。请改用if 语句。

      传统上,switch 语句(以及其他语言的CASE 语句)用于设置跳转表。也就是说,在 C 程序中:

      switch (n) {
          case 1:
              ...code
          case 2:
              ...code
          case 14:
              ...code
      }
      

      编译器会建立一个至少有 14 个条目的表。表中的#1、#2 和#14 条目将包含它将跳转到的位置的代码地址。 (其他的将具有“默认”位置的地址。)然后,编译器生成的代码不会是一系列“与 1 比较,如果相等,则与 2 比较,如果相等-then else ...” 各种指令;相反,在确定n在表的范围内之后,它会索引到表中,找到地址,然后直接跳转到那里。非常有效率。如果你给它一个整数,Java 会做同样的事情(对于Strings,它可以根据哈希码创建一个跳转表,但它仍然必须比较字符串是否相等——感谢@ErwinBolwidt 提供更多信息关于这个)。

      不过,这一切背后的要点是,为了生成表格,编译器必须提前知道值。因此,至少在 C 或 Java 中,不支持您要求的内容。 (我认为有些语言确实放宽了这一点并允许在case 中使用变量值,但它们可能全部或大部分都是解释性语言。)

      【讨论】:

      • Java 还为整数和字符串创建了一个跳转表(参见:stackoverflow.com/questions/22110707/…
      • @ErwinBolwidt 感谢您的链接。我想也许它可以使用哈希码;我只是不确定它是否真的如此。
      • 是的,我明白了...这只是一个意见...如果可以开发 java 在 switch case 语句中使用变量,那将非常有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      相关资源
      最近更新 更多