有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

什么是带美元符号和数字的java文件名。类(名称$1.class)?

当我编译java Enum Day时,它会生成他的Day。类文件和8天$#。类文件,所以我想知道编译器为什么生成8$#。类而不是7,因为我有7个枚举常量,但有8个重写注释,所以我理解了美元。类文件是为每个内部类或枚举常量生成的,但这八个类又如何呢。类文件生成它的目的是什么

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美元。阶级
  • 每天6美元。阶级
  • 每天7美元。阶级
  • 每天8美元。阶级

共 (2) 个答案

  1. # 1 楼答案

    我刚刚复制并编译了您的代码,在我的机器上的结果如下:

    • 一天。阶级
    • 每天1美元。阶级
    • 每天2美元。阶级
    • 每天3美元。阶级
    • 每天4美元。阶级
    • 每天5美元。阶级
    • 每天6美元。阶级
    • 每天7美元。阶级

    没有创建Day$8.class。也许你以前有8个内部类,你编译了,然后删除了一个。。。 尝试使用文本编辑器打开。类文件,您可以从可读字符中了解更多内容。。。 例如,在我的Day$1.class中,我可以阅读文本“今天是星期天”

  2. # 2 楼答案

    通过每个枚举文字生成一个类,该类由枚举名称加上枚举文字索引标识,除枚举生成的类外,后缀为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