main方法在枚举和类中的工作方式不同吗



在以下代码中:

enum Rank {
    FIRST(20), SECOND(0), THIRD(8);
    Rank(int value) {
        System.out.print(value);
    } 
    public static void main (String[] args) {
        System.out.println(" " + Rank.values().length);
    }
}

这会产生以下输出:

2008 3

然而,如果main方法在其他类中声明,如

class XYZ {
    public static void main (String[] args) {
        System.out.println("n" + Rank.values().length);
    }
}

输出仅为3。枚举中的main和类中的main之间有什么区别?为什么我有两个不同的输出?

枚举常量是static。它们是在类初始化时初始化的(enum只是一个类(。这意味着,当您调用引用enum类型的类的main时,所有值都是使用构造函数创建的。

如果其他类没有以任何方式引用enum,则不会打印任何输出,因为没有评估enum

您实际上看到了枚举打印的构造函数。

因此在开始时CCD_ 11被创建并且CCD_。

那么CCD_ 13和CCD_;这都是由类加载器完成的,因为秩枚举正由CCD_ 15使用。

由于Rank中的构造函数使用print而不是println,所以它们都显示在一行上。

然后,当EnumCreation进入主方法时,它会打印一个空格,后面跟着Rank.values().length和一条换行符。

XYZ进入主方法时,它应该做同样的事情;但它会打印一个换行符而不是空格。

不过,从类的角度来看,您有3个类。等级、枚举创建和XYZ。Rank和EnumCreation恰好共享1*.java文件。

希望这有助于澄清问题!

类和枚举之间最显著的区别是enum预定义了实例。在枚举加载时打印该值。它执行枚举的构造函数,以创建列组,进而打印其值。而为普通类执行main没有方法实现,也没有自动创建对象。您必须创建类的实例。希望你明白我的意思。

Enum 的更多详细信息

因此,主方法中没有差异,但差异对您来说是可见的,因为枚举的实例是在VM加载枚举时创建的。:(

根据@Blip的请求,我正在更新我的答案,所以即使你把主方法分开,它也不会改变任何事情。作为仍引用Rank枚举的主要方法,因此enum由运行时加载,并且我们已经知道,enum的实例将在加载类时创建,它仍将执行构造函数,因此您将看到输出为2008 3

Class初始化器和实例(或Object(初始化器之间存在差异。Class初始化程序在加载Class时运行,这通常发生在第一次引用它时。Object初始化器是仅在使用new关键字创建新实例时运行的构造函数(禁止反射(。

Enum是静态实例。你可以把它们想象成单身汉——你从来没有newEnum

假设我有这个Class定义的

public class Foo {
    static{
        System.out.println("Someone loaded the class");
    }
    public Foo(){
        System.out.print("Foo constructor");
    }
    public static void main(String[] args) {
        System.out.println("Making Foo");
        Foo foo = new Foo();
    }
}

输出为

有人加载了类制作FooFoo构造函数

CCD_ 32将像CCD_ 33中的静态块一样工作。

这是一个Enum示例

public enum FooValues {
    HELLO,GOODBYE,WHAT;
    private FooValues(){
        System.out.println(this);
    }
    public static void main(String[] args) {
        System.out.println("in main");
    }
}

这提供

HELLO再见什么主要

因为加载Enum时,所有值都会在类加载阶段初始化,然后运行main方法。

相关内容

  • 没有找到相关文章

最新更新