`
JasonRight
  • 浏览: 72911 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

enum 类的静态成员初始化在构造方法之后

    博客分类:
  • Java
阅读更多

Enum的初始化顺序和一般的类不同

public enum Color  {
	RED("Red"),
	BLACK("Black"),
	WHITE("White");
	
	private static int field = initStaticField();
	
	Color(String name) {
		System.out.println("Constructor: " + name);
	}

	private static int initStaticField() {
		System.out.println("satic field ");
		return 0;
	}
	
	public static void main(String[] args) {
		Color red = Color.RED;
	}
}

 

 

Console:
    Constructor: Red
    Constructor: Black
    Constructor: White
    static field

public class NormalClass {
	private static int field = initStaticField();
	
	NormalClass() {
		System.out.println("Constructor" );
	}

	private static int initStaticField() {
		System.out.println("static field ");
		return 0;
	}
	
	public static void main(String[] args) {
		NormalClass c = new NormalClass();
	}
}



Console:
    static field
    Constructor

 

分享到:
评论
4 楼 JasonRight 2010-09-15  
salever 写道
LZ的说法不太妥当呢,enum中,该枚举类型的常量一般放在最前面,这部分相当于是public static 类型的,它们在初始化的时候会调用构造函数,


你是对的。 枚举常量前面不能加入任何其他field声明。 http://www.javapractices.com/topic/TopicAction.do?Id=1
3 楼 salever 2010-09-13  
LZ的说法不太妥当呢,enum中,该枚举类型的常量一般放在最前面,这部分相当于是public static 类型的,它们在初始化的时候会调用构造函数,所以Constructor: Red首先被打印

然后执行到   private static int field = initStaticField(); 
打印static field

并非枚举类型的静态成员初始化在构造函数之后。

修改一下你下面的例子:
public class NormalClass {
	
	public static final NormalClass INSTANCE = new NormalClass(); 
	
	private static int field = initStaticField();

	NormalClass() {
		System.out.println("Constructor");
	}

	private static int initStaticField() {
		System.out.println("static field ");
		return 0;
	}

	public static void main(String[] args) {
		NormalClass c = new NormalClass();
	}
}


运行结果为:
Constructor
static field
Constructor

因此,枚举类型的静态成员初始化都在构造函数之前的,这与一般的class不矛盾的。
2 楼 JasonRight 2010-06-14  
dmwdmc 写道
大发现,这个是JDK1.5后才有的么 。ENUM类


是在<effective java>里面看到的
1 楼 dmwdmc 2010-06-07  
大发现,这个是JDK1.5后才有的么 。ENUM类

相关推荐

    java 中enum的使用方法详解

    - 枚举可以作为类的静态成员,用于表示该类的状态或分类。 - 枚举在序列化和反序列化时会自动处理,不需要额外的代码。 - 枚举可以用来实现单例模式,因为每个枚举实例都是唯一的。 6. **枚举的优点** - 增强了...

    Java Enum使用Demo源码

    枚举也可以有构造函数,但只能由Java编译器在枚举初始化时调用。枚举构造函数常用于初始化枚举常量的属性: ```java public enum Color { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); private int hexCode...

    Java中的Enum的使用与分析

    - **静态初始化**:枚举的元素在类加载时会被初始化。 - **单例模式**:每个枚举元素都是一个单例。 #### 三、枚举的内部结构 枚举类型在编译后会被转换成一个特殊的类。例如,上面的`Color`枚举类型在编译后会...

    javaenum学习.pdf

    枚举类型在Java中提供了丰富的功能,不仅能够定义一组固定的实例,还能通过继承`Enum`类获得许多便利的方法,使其在编码实践中非常实用。在编写涉及有限、预定义值的代码时,优先考虑使用枚举类型是一个良好的编程...

    Java 实例 - Enum(枚举)构造函数及方法的使用源代码-详细教程.zip

    枚举构造函数主要用于初始化枚举实例的内部状态,但需要注意,构造函数不能被外部直接调用,只能在枚举实例的定义中使用。例如: ```java public enum Color { RED(1), GREEN(2), BLUE(3); private int value; ...

    java enum 枚举的spring boot2.x完美实现demo源码

    这里,`Status`枚举有两个实例,每个都有一个`description`属性,可以通过构造函数初始化,并提供了获取描述的方法。 在Spring Boot应用中,枚举可以作为控制器参数、服务方法返回值,甚至在数据库映射中使用。例如...

    java的Enum

    构造方法通常用于为枚举常量设置初始值或执行其他初始化操作。 **示例代码**: ```java enum Color { RED("红色"), GREEN("绿色"), BLUE("蓝色"); private String name; Color(String name) { this.name = ...

    面向对象(高级)知识点强势总结!!!

    + 代码块的执行顺序:静态初始化块 &gt; 实例初始化块 &gt; 构造器 五、关键字:final * final关键字的使用 + final用来修饰:变量、方法、类 + final变量:只能赋值一次,不能修改 + final方法:不能被子类覆盖 + ...

    Java中enum的用法.pdf

    在枚举中,我们可以定义构造方法来初始化每个枚举实例。例如: ```java public enum WeekDay { Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri("Friday"), Sat("Saturday"), Sun(...

    JAVA类的特性资料

    11. **内部类**:Java支持类的嵌套,内部类可以作为外部类的成员,有成员内部类、局部内部类、匿名内部类和静态内部类等。内部类可以访问外部类的私有成员,增加了代码的复杂性和灵活性。 12. **包(package)**:...

    java中enum枚举的详细用法

    枚举类可以有构造函数,用于初始化枚举实例。例如: ```java public enum WeekDay { Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri("Friday"), Sat("Saturday"), Sun("Sunday"); ...

    C#基础知识

    6. **静态成员与非静态成员**:静态成员在类加载时初始化,直接通过类名访问,整个类共享;非静态成员在对象创建时初始化,通过对象实例访问,每个实例有自己的副本。 7. **密封类(Sealed Class)**:用`sealed`...

    java基础课程1.docx

    - **初始化顺序**:父类属性初始化-&gt;父类构造方法-&gt;子类属性初始化-&gt;子类构造方法。 - 如果父类没有构造方法,子类构造方法会隐式调用父类的无参构造方法。 - 如果父类有构造方法,则子类必须显式调用父类的构造...

    第六次作业1

    在给定的代码片段中,我们看到了三个不同的实验,它们涉及到C++编程语言中的类、枚举、构造函数、析构函数以及对象的初始化。以下是这些知识点的详细说明: 1. 枚举(Enum): 枚举是C++中用于定义一组命名常量的...

    java enum枚举教程学习资料

    如果需要,枚举元素可以带有初始化参数,这相当于在枚举类中定义了一个构造器来初始化元素: ```java public enum Color { RED("红色", 0), BLUE("蓝色", 1), BLACK("黑色", 2); private String name; ...

    周玉川_2017221302006_第二次作业1

    6. 静态初始化块与构造器:在`Cups`和`Cup`类的示例中,静态初始化块(`static`代码块)会在类加载时执行一次,而构造器在创建对象时执行。当创建`Cups`类的对象时,会先执行静态初始化块,然后是`Cups`的构造器。...

    Java-设计模式-单例模式-实现源码(简单实现、双重检查锁、静态内部类、枚举类)

    最简单的单例实现方式是在类中创建一个私有的构造函数,并提供一个公共的静态方法来获取唯一的实例。这种方式在单线程环境下工作良好,但在多线程环境中可能会创建多个实例,因为它不考虑同步问题。 ```java ...

    java第七章高级类特性.rar

    15. **枚举的常量工厂方法**:枚举类可以提供静态工厂方法来创建实例,这有助于控制枚举实例的创建,并提供额外的初始化逻辑。 以上只是“第七章高级类特性”中可能涵盖的一些关键点,具体的学习内容还会涉及到这些...

    小码哥-任小龙Java笔记-面向对象的全部笔记

    - 用于初始化类的静态成员,会在类加载时执行,且只执行一次。 - 示例:`static { System.out.println("静态代码块"); }` **13. final修饰** - `final`修饰的类不能被继承。 - `final`修饰的方法不能被子类覆盖。 ...

Global site tag (gtag.js) - Google Analytics