2014-11-06 56 views
1

我是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語句中使用它。我不想在切換case語句後使用x ...請幫助我...

+0

我不認爲你可以用'a.x'甚至'a.getX()'在case語句。它只接受常量。 – A4L 2014-11-06 16:06:12

+0

是的......這就是我想要做的......我想在case語句中使用ax ...所以我想重新初始化它作爲一個常量......我的問題是,有沒有辦法要做到這一點 ? – 2014-11-06 16:09:27

+1

是的,不要使用[switch-case](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html),使用'if-elseif-else' – A4L 2014-11-06 16:10:32

回答

4

我想知道是否有一種方法在以後使用它作爲一個變量之後重新初始化聲明的全局變量,常量...

沒有,沒有。 (Java也沒有全局變量;看着你的代碼,xy實例數據成員最接近的Java有全局變量public static [又名「類」]數據成員的公共類)

那是因爲做了一些工作有一個聲明的變量後,我想在一個開關case語句使用它...

你不能,如果情況值(a.x,你的情況)AREN常量。相反,你必須使用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 { 
      // ... 
     } 
    } 
} 
+0

「Java也沒有全局變量;」全局變量不是靜態變量嗎? – 2014-11-06 16:16:22

+0

@whiletrue不,他們不是,公共靜態更接近,但他們仍然沒有正確的全局性和可用性無處不在 – Ordous 2014-11-06 16:24:16

+0

@whiletrue:類中的'public static'數據成員*關閉*爲全局變量,如果它們'重新是'公共'。 – 2014-11-06 16:53:23

0

不,答案是您無法在Java中執行此操作。

案例後面的「事物」需要是常量。
在Java 7或更高版本中,還可以使用字符串作爲案例標籤。

Switch statement Java

1

那是不可能的。要在switch中使用某些情況,它必須是編譯時已知的常量。如果你想基於一個變量來設置它(即在運行時),那麼在編譯時就不可能知道它的方式。

0

您只能打開編譯時間常量。我認爲你想通過簡單的if語句來實現。

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

由於Java中的常量是編譯時間,「重新初始化」作爲一個概念是沒有意義的。

+0

是的,但我想通過使用Switch-Case語句來簡化它。現在覺得不能那樣做。 – 2014-11-06 16:36:55

1

在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,如果相等 - 其他......「種說明;相反,在確定n在表格的範圍內後,它將索引到表格中,找到地址並直接跳到那裏。非常有效。如果你給它一個整數(對於String s,它可以根據哈希代碼創建一個跳轉表,但它仍然需要比較字符串是否相等 - 這要歸功於@ErwinBolwidt以提供關於此的更多信息)。

但是,所有這一切背後的要點是,爲了生成表格,編譯器必須提前知道這些值。所以你所要求的不支持,至少在C或Java中。 (我認爲有些語言可以放鬆這一點並允許case中的變量值,但它們可能全部或大部分都是解釋型語言。)

+0

Java也爲整數創建了一個跳轉表,但也用於字符串(參見:http://stackoverflow.com/questions/22110707/how-is-string-in-switch-statement-more-efficient-than-corresponding-if -else-stat/22110821#22110821) – 2014-11-06 16:28:22

+0

@ErwinBolwidt感謝您的鏈接。我想也許它可以使用哈希碼;我只是不確定它是否真的。 – ajb 2014-11-06 16:43:49

+0

是的,我知道了......這只是一個意見......如果可以開發java來在開關case語句中使用變量,這將是非常有用的。 – 2014-11-06 16:47:47