首页 > 试题广场 >

下面代码输出是?

[单选题]
下面代码输出是?
enum AccountType
{
    SAVING, FIXED, CURRENT;
    private AccountType()
    {
        System.out.println("It is a account type");
    }
}
class EnumOne
{
    public static void main(String[]args)
    {
        System.out.println(AccountType.FIXED);
    }
}

  • 编译正确,输出”It is a account type”once followed by”FIXED”
  • 编译正确,输出”It is a account type”twice followed by”FIXED”
  • 编译正确,输出”It is a account type”thrice followed by”FIXED”
  • 编译正确,输出”It is a account type”four times followed by”FIXED”
  • 编译错误
推荐
答案:C
枚举类有三个实例,故调用三次构造方法,打印三次It is a account type
编辑于 2015-02-04 17:11:24 回复(13)
枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,原先的枚举类型变成对应的实体类型,上例中AccountType变成了个class AccountType,并且会生成一个新的构造函数,若原来有构造函数,则在此基础上添加两个参数,生成新的构造函数,如上例子中:
private AccountType(){ System.out.println(“It is a account type”); } 
会变成:
private AccountType(String s, int i){
    super(s,i); System.out.println(“It is a account type”); }
而在这个类中,会添加若干字段来代表具体的枚举类型:
public static final AccountType SAVING;
public static final AccountType FIXED;
public static final AccountType CURRENT;

而且还会添加一段static代码段:
static{
    SAVING = new AccountType("SAVING", 0);
    ...  CURRENT = new AccountType("CURRENT", 0);
   $VALUES = new AccountType[]{
         SAVING, FIXED, CURRENT
    } }
以此来初始化枚举中的每个具体类型。(并将所有具体类型放到一个$VALUE数组中,以便用序号访问具体类型)
在初始化过程中new AccountType构造函数被调用了三次,所以Enum中定义的构造函数中的打印代码被执行了3遍。
编辑于 2016-09-14 15:29:42 回复(42)
此处应该有掌声
发表于 2017-06-22 16:45:34 回复(26)
枚举类 所有的枚举值都是类静态常量,在初始化时会对所有的枚举值对象进行第一次初始化。
发表于 2015-08-27 21:33:51 回复(8)
枚举类有多少个实例,就会调用多少次构造方法
枚举类构造方法只能加private修饰符(或不加),因为枚举类本身已经是构造好的,不允许再被外部构造


编辑于 2017-08-11 11:51:23 回复(1)
  创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式Class Enum<E extends Enum<E>>,而E表示枚举类型的名称。 枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中
简单来说就是枚举类型中的枚举值都会对应调用一次构造函数 
本题中三个枚举值,
   这里还要特别强调一下,枚举中的构造函数是私有类,也就是无法再外面创建enum
枚举值默认static ,AccountType.FIXED使用的是枚举值,没有创建。所以一共就3次。
编辑于 2015-11-03 22:05:23 回复(1)
发表于 2016-10-09 13:29:39 回复(0)
枚举类有三个实例,所以要调用三次构造方法
发表于 2015-08-10 11:57:27 回复(0)
1. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum (抽象类) 类的子类。
enum AccountType
{
    SAVING, FIXED, CURRENT;
    private AccountType()
    {
        System.out.println(“It is a account type”);
    }
} 
2.这段代码实际上调用了3次 Enum(String name, int ordinal),new了3次,也就执行了三次构造方法。
new Enum<AccountType>("SAVING",0);
new Enum<AccountType>("FIXED",1);
new Enum<AccountType>("CURRENT",2);
3.枚举类型的每一个值都将映射到protected Enum(String name, int ordinal)构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。

编辑于 2018-04-17 14:55:44 回复(0)
"自定义枚举类"在编译后会生成一个"编译后的类",此"编译后的类"继承自 Enum 类。此"编译后的类"中有一个static代码块,会调用n次"编译后的类"的构造方法(n为"自定义枚举类"中实例的个数)。
可以看源码分析理解enum的机制,如果有耐心看完,会了解得比较清楚。

enum(枚举类型)

转载自:Java 枚举源码分析

引言

枚举类型是 JDK 5 之后引进的一种非常重要的引用类型,可以用来定义一系列枚举常量。

在没有引入 enum 关键字之前,要表示可枚举的变量,只能使用public static final的方式。

public staic final int SPRING = 1;
public staic final int SUMMER = 2;
public staic final int AUTUMN = 3;
public staic final int WINTER = 4;

这种实现方式有几个弊端。首先,类型不安全。试想一下,有一个方法期待接受一个季节作为参数,那么只能将参数类型声明为 int,但是传入的值可能是 99。显然只能在运行时进行参数合理性的判断,无法在编译期间完成检查。其次,指意性不强,含义不明确。我们使用枚举,很多场合会用到该枚举的字串符表达,而上述的实现中只能得到一个数字,不能直观地表达该枚举常量的含义。当然也可用 String 常量,但是又会带来性能问题,因为比较要依赖字符串的比较操作。

使用 enum 来表示枚举可以更好地保证程序的类型安全和可读性。

enum 是类型安全的。除了预先定义的枚举常量,不能将其它的值赋给枚举变量。这和用 int 或 String 实现的枚举很不一样。

enum 有自己的名称空间,且可读性强。在创建 enum 时,编译器会自动添加一些有用的特性。每个 enum 实例都有一个名字 (name) 和一个序号 (ordinal),可以通过 toString() 方法获取 enum 实例的字符串表示。还以通过 values() 方法获得一个由 enum 常量按顺序构成的数组。

enum 还有一个特别实用的特性,可以在 switch 语句中使用,这也是 enum 最常用的使用方式了。

下面我们从源码方面分析一下 enum 的实现方式,并介绍几种 enum 的用法。

反编译枚举类型源码

public enum Season {
  SPRING, SUMMER, AUTUMN, WINTER;
}

用 javap 反编译一下生成的 class 文件:

public final class Season extends java.lang.Enum<Season> {
  public static final Season SPRING;
  public static final Season SUMMER;
  public static final Season AUTUMN;
  public static final Season WINTER;
  public static Season[] values();
  public static Season valueOf(java.lang.String);
  static {};
}

可以看到,实际上在经过编译器编译后生成了一个 Season 类,该类继承自 Enum 类,且是 final 的。从这一点来看,Java 中的枚举类型似乎就是一个语法糖。

每一个枚举常量都对应类中的一个public static final的实例,这些实例的初始化应该是在 static {} 语句块中进行的。因为枚举常量都是 final 的,因而一旦创建之后就不能进行更改了。 此外,Season 类还实现了values()和valueOf()这两个静态方法。

再用 jad 进行反编译,我们可以大致看到 Season 类内部的实现细节:

public final class Season extends Enum
{

    public static Season[] values()
    {
        return (Season[])$VALUES.clone();
    }

    public static Season valueOf(String s)
    {
        return (Season)Enum.valueOf(Season, s);
    }

    private Season(String s, int i)
    {
        super(s, i);
    }

    public static final Season SPRING;
    public static final Season SUMMER;
    public static final Season AUTUMN;
    public static final Season WINTER;
    private static final Season $VALUES[];

    static 
    {
        SPRING = new Season("SPRING", 0);
        SUMMER = new Season("SUMMER", 1);
        AUTUMN = new Season("AUTUMN", 2);
        WINTER = new Season("WINTER", 3);
        $VALUES = (new Season[] {
            SPRING, SUMMER, AUTUMN, WINTER
        });
    }
}

除了对应的四个枚举常量外,还有一个私有的数组,数组中的元素就是枚举常量。编译器自动生成了一个 private 的构造方法,这个构造方法中直接调用父类的构造方法,传入了一个字符串和一个整型变量。从初始化语句中可以看到,字符串的值就是声明枚举常量时使用的名称,而整型变量分别是它们的顺序(从0开始)。枚举类的实现使用了一种多例模式,只有有限的对象可以创建,无法显示调用构造方法创建对象。

values()方法返回枚举常量数组的一个浅拷贝,可以通过这个数组访问所有的枚举常量;而valueOf()则直接调用父类的静态方法Enum.valueOf(),根据传入的名称字符串获得对应的枚举对象。

Enum 类是不能被继承的,如果我们按照上面反编译的结果自己写一个这样的实现,是不能编译成功的。Java 编译器限制了我们显式的继承java.Lang.Enum类, 报错The type may not subclass Enum explicitly。

编辑于 2020-06-24 10:33:18 回复(1)
我在Eclipse的运行结果是这样子的。

It is a account type

It is a account type

It is a account type

FIXED
发表于 2015-06-30 07:55:32 回复(2)
当枚举类有构造函数时,先打印构造函数中的东西(有几个实例打印几次)。然后再输出要调用的实例 
发表于 2022-04-30 20:49:04 回复(0)

迅雷这个臭弟弟老是出这种英文题,我佛了

发表于 2019-04-05 22:25:04 回复(1)
枚举类 每一个元素都会创建一个一个对象实例!
发表于 2021-05-17 10:01:28 回复(0)
枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,原先的枚举类型变成对应的实体类型,上例中AccountType变成了个class AccountType,并且会生成一个新的构造函数,若原来有构造函数,则在此基础上添加两个参数,生成新的构造函数,如上例子中:
1
privateAccountType(){ System.out.println(“It is a account type”); }
会变成:
1
2
privateAccountType(String s, inti){
    super(s,i); System.out.println(“It is a account type”); }
而在这个类中,会添加若干字段来代表具体的枚举类型:
1
2
3
publicstaticfinalAccountType SAVING;
publicstaticfinalAccountType FIXED;
publicstaticfinalAccountType CURRENT;

而且还会添加一段static代码段:
1
2
3
4
5
6
static{
    SAVING = newAccountType("SAVING", 0);
    ...  CURRENT = newAccountType("CURRENT", 0);
   $VALUES = newAccountType[]{
         SAVING, FIXED, CURRENT
    } }
发表于 2019-12-26 16:10:10 回复(1)
枚举类有三个实例,故调用3次构造方法,打印3次It is a account type
不过做这题首先得了解英文
发表于 2018-10-30 15:08:55 回复(0)
SAVING, FIXED, CURRENT;这三个枚举值实际上代表了该枚举类的所有可能的实例。
注意:在枚举类中,列出枚举值时,实际上就是调用构造器创建枚举类的对象。
因此,这里调用无参构造器三次。

编辑于 2017-07-11 22:05:03 回复(0)

  所以定义几个枚举常量,会调用构造函数几次,所以要输出三次构造函数中的值
  

发表于 2016-07-29 22:41:35 回复(2)
枚举类的实例是在类定义的第一行显示的写出的,题中定义了三个实例SAVING, FIXED, CURRENT,所以会调用三次构造函数。
发表于 2015-10-08 19:55:02 回复(0)
枚举有几个类,就调用几次构造方法
发表于 2022-02-15 14:34:40 回复(0)
我TM刚碰到这个相似度高达百分之99的题,里面是选项每一个是对的,所以一看到这题,连选项都没看直接选了D😒
发表于 2020-08-16 19:37:29 回复(0)