首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是带有美元符号和数字.class的java文件名(名称$1.class)?

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

Stack Overflow用户
提问于 2013-10-01 13:40:41
回答 2查看 4.6K关注 0票数 7

当我编译我的java时,它会生成他的Day.class文件和8个Day$#.class文件,所以我想知道为什么编译器生成8 $#.class而不是7,因为我有7个枚举常量,但是有8个重写注释,我知道Dollar.class文件是为每个内部类或枚举常量生成的,但是生成它的八个.class文件呢?

代码语言:javascript
复制
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班
  • 每日$2班次
  • 第三天$3
  • 每日$4.
  • 每日$5.
  • 每日$6.
  • 7天7美元
  • 每日8元
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-01 14:26:06

由每个Enum文字生成一个类,由Enum的名称加上enum文字的索引来标识,除了Enum生成的类之外,带有8后缀的枚举类是一个名为SwitchMap的映射,它维护开关使用的枚举文字索引的引用,如果您执行此代码,就可以看到它。

代码语言:javascript
复制
        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
票数 3
EN

Stack Overflow用户

发布于 2013-10-01 14:25:22

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

  • Day.class
  • 每日$1班
  • 每日$2班次
  • 第三天$3
  • 每日$4.
  • 每日$5.
  • 每日$6.
  • 7天7美元

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19117753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档