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

When i compile my java Enum Day, it generates his Day.class file and 8 Day$#.class Files, so i want to know why the compiler generates 8 $#.class instead of 7, because i have 7 enum constants, but 8 override annotations, i have understood that the Dollar.class files are generated for every inner class or by enum constants, but what about the eight .class file what it is generated for?

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();

}

And it generates this:

Day.class

Day$1.class

Day$2.class

Day$3.class

Day$4.class

Day$5.class

Day$6.class

Day$7.class

Day$8.class

解决方案

By each Enum literal is generated a class identified by the name of the Enum plus the index of the enum literal, all this apart of the Enum generated class, the enum class with the suffix 8 is a map called SwitchMap wich is a map that maintaing a reference of enum literal index that are used by the switch, if you excute this code you can see it.

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值