2013-10-01 60 views
6

當我編譯我的Java枚舉日,它會生成他的Day.class文件和8天$#.class文件,所以我想知道爲什麼編譯器生成8 $#。類而不是7,因爲我有7枚枚舉常量,但8覆蓋註釋,我已經瞭解Dollar.class文件是爲每個內部類或枚舉常量生成的,但是八個.class文件是爲什麼生成的?

package com.kaissersoft.test.objective.one.three.enums; 

public enum Day{ 
    SUNDAY(01){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Sunday"); 
    } 
}, 
MONDAY(02){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Monday"); 
    } 
}, 
TUESDAY(03){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Tuesday"); 
    } 
}, 
WEDNESDAY(04){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Wednesday"); 
    } 
}, 
THURSDAY(05){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Thursday"); 
    } 
}, 
FRIDAY(06){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Friday"); 
    } 
}, 
SATURDAY(07){ 
    @Override 
    public void salute(){ 
     System.out.println("Today is Saturday"); 
    } 
}; 

int dayNumber; 
Day(final int day){ 
    dayNumber = day; 
} 

public int getDayNumber(){ 
    return dayNumber; 
} 

@Override 
public String toString(){ 

    switch(this){ 
     case SUNDAY: 
      System.out.println("Sunday("+this.getDayNumber()+")"); 
      break; 
     case MONDAY: 
      System.out.println("Monday("+this.getDayNumber()+")"); 
      break; 
     case TUESDAY: 
      System.out.println("Tuesday"+this.getDayNumber()+")"); 
      break; 
     case WEDNESDAY: 
      System.out.println("Wednesday("+this.getDayNumber()+")"); 
      break; 
     case THURSDAY: 
      System.out.println("Thursday("+this.getDayNumber()+")"); 
      break; 
     case FRIDAY: 
      System.out.println("Friday("+this.getDayNumber()+")"); 
      break; 
     case SATURDAY: 
      System.out.println("Saturday("+this.getDayNumber()+")"); 
      break; 
    } 
    return super.toString(); 
} 

//Abstract method to the day Salute 
public abstract void salute(); 
} 

而且它生成此:

  • Day.class
  • 日$ 1.class
  • 日$ 2.class
  • 日$ 3.class
  • 日$ 4.class
  • Day $ 5.class
  • Da Y $ 6.class
  • 日$ 7.class
  • 日$ 8.class
+0

@SotiriosDelimanolis不是真的,這裏的紳士知道這個名字上有什麼美元符號,他在詢問別的什麼。 –

+5

(你確實知道你在使用八進制常量嗎?) –

+0

我正在玩編譯器,並且我已經減去了toString覆蓋中的開關,並且它生成了7個.class文件,所以我構建了第八個由enum生成的文件開關??任何人都知道這是否是答案? – Eefret

回答

1

通過每個枚舉文字生成一個由Enum的名稱加上枚舉文字的索引所標識的類,所有這些除了Enum生成的類,帶有後綴8的枚舉類都是一個名爲SwitchMap的地圖,一個保存交換機使用的枚舉文字索引引用的映射,如果您執行此代碼,您可以看到它。

 try{ 
      Class<?> c = Class.forName("com.kaissersoft.test.objective.one.three.enums.Days$8"); 

      Field[] fs= c.getDeclaredFields(); 
      for(Field f: fs){ 
      System.out.println(f.toString()); 
      } 
     }catch(ClassNotFoundException cne){ 
      cne.printStackTrace(); 
     } 


// Output 
static final int[] com.kaissersoft.test.objective.one.three.enums.Days$8.$Switch 
Map$com$kaissersoft$test$objective$one$three$enums$Days 
+0

得到了相當好的回答 – Eefret

0

我剛纔複製並編譯了代碼,並在我的機器上,結果如下:

  • 日。類
  • 日$ 1.class
  • 日$ 2.class
  • 日$ 3.class
  • 日$ 4.class
  • 日$ 5.class
  • 日$ 6.class
  • 日$ 7.class

沒有Day$8.class已創建。也許你有8個內部類,你編譯,然後你只是刪除一個... 嘗試用文本編輯器打開.class文件,你可以從可讀的字符中瞭解更多... 例如在我的Day$1.class我可以看短信「今天是星期天」

+1

它可能是編譯器相關的。 –

相關問題