java 文件名中带有美元符号和数字 .class (name$1.class) 是什么意思? [复制]

2024-04-16

当我编译我的java Enum Day时,它生成他的Day.class文件和8个Day$#.class文件,所以我想知道为什么编译器生成8个$#.class而不是7个,因为我有7个枚举常量,但是8 个覆盖注释,我知道 Dollar.class 文件是为每个内部类或枚举常量生成的,但是生成的 8 个 .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();
}

它生成这个:

  • 日间班
  • 日$1.班
  • 日$2.班
  • 日$3.班
  • 日$4.班
  • 日间$5.class
  • 日间$6.class
  • 日间$7.class
  • 日间$8.class

每个 Enum 字面量都会生成一个由 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 文件名中带有美元符号和数字 .class (name$1.class) 是什么意思? [复制] 的相关文章

随机推荐