首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么enum的构造函数不能访问静态字段?

在Java中,枚举类型(enum)是一种特殊的类,它是由Java编译器自动生成的。枚举类型的构造函数是私有的,因此不能被外部代码访问。这是为了确保枚举类型中的所有实例都是唯一的,并且在类加载时就被初始化。

当您尝试在枚举类型的构造函数中访问静态字段时,Java编译器会报错,因为静态字段在实例化之前就需要被初始化,而构造函数在实例化过程中被调用。如果您需要在枚举类型中使用静态字段,可以在枚举类型中定义一个静态代码块,并在其中初始化静态字段。

例如:

代码语言:java
复制
public enum Color {
    RED,
    GREEN,
    BLUE;

    private static final Map<String, Color> stringToEnum = new HashMap<>();

    static {
        for (Color color : Color.values()) {
            stringToEnum.put(color.toString(), color);
        }
    }

    public static Color fromString(String colorString) {
        return stringToEnum.get(colorString);
    }
}

在上面的例子中,我们定义了一个名为Color的枚举类型,并在其中定义了一个静态字段stringToEnum。我们在静态代码块中初始化了stringToEnum,并提供了一个静态方法fromString,用于将字符串转换为枚举类型的实例。这样,我们就可以在枚举类型中使用静态字段,而不会影响枚举类型的实例化过程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么构造函数不能为虚函数

1、从使用角度         虚函数主要用于在信息不全情况下,能使重载函数得到对应调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。...虚函数作用在于通过父类指针或者引用来调用它时候能够变成调用子类那个成员函数。而构造函数是在创建对象时自动调用,不可能通过父类指针或者引用去调用,因此也就规定构造函数不能是虚函数。...2、从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数    从实际含义上看,在调用构造函数时还不能确定对象真实类型(因为子类会调父类构造函数);而且构造函数作用是提供初始化...而且,只要它是最后构造函数调用,那么在这个对象生命期内, V P T R将保持被初始化为指向这个V TA B L E, 但如果接着还有一个更晚派生构造函数被调用,这个构造函数又将设置V P T R...V P T R状态是由被最后调用构造函数确定。这就是为什么构造函数调用是从基类到更加派生 类顺序另一个理由。

2.2K91

为什么应该尽可能避免在静态构造函数中初始化静态字段

如下所示两段IL代码分别来源于Foo和Bar,我们可以看到虽然Foo类中没有显式定义静态构造函数,但是编译器会创建一个默认静态构造函数,针对静态字段初始化就放在这里。...从Foo和BarIL代码可以看出,针对它们静态字段初始化都放在静态构造函数中。...但是当我们调用一个并不涉及类型静态字段Invoke方法时,定义在Foo中静态构造函数会自动执行,但是定义在Bar中则不会,由此可以看出一个类型静态构造函数执行时机与类型是否具有beforefieldinit...具有beforefieldinit标记:静态构造函数会在第一次读取任何一个静态字段之前自动执行,这相当于一种Lazy loading模式; 不具有beforefieldinit标记:静态构造函数会在如下场景下自动执行...,所以我们自行定义专门用来初始化静态字段静态构造函数是完全没有必要

15210

为什么不允许使用 Java 静态构造函数

不允许使用 Java 静态构造函数,但是为什么呢?在深入探讨不允许使用静态构造函数原因之前,让我们看看如果要使 构造函数静态化 会发生什么。...由于构造函数不是类属性,因此有理由认为它不能静态静态块 / 方法无法访问静态变量 我们知道静态方法不能访问静态变量。静态块也是如此。 现在,构造函数主要目的是初始化对象变量。...因此,如果我们将构造函数设置为静态,则无法初始化对象变量。这将破坏使用创建对象构造函数全部目的。因此,使构造函数为非静态是合理。 注意,我们不能this在静态方法中使用引用对象变量。...下面的代码将定义编译错误,因为:不能静态上方中使用它。...因此,如果构造函数转换静态,我们将无法使用它,这将破坏java中继承性。 正是金九银十跳槽季,为大家收集了2019年最新面试资料,有文档、有攻略、有视频。

3K70

实例化顺序:静态数据、构造函数字段执行顺序详解

引言 在面向对象编程中,类实例化是一个重要概念。当我们创建一个类实例时,其中涉及到多个步骤,包括父类和子类静态数据初始化、构造函数执行以及字段初始化。...这些静态数据在整个类层次结构中只会初始化一次。 父类构造函数:接着,父类构造函数会被调用。父类构造函数可能会执行一些初始化操作,例如设置实例字段默认值。...子类静态数据初始化:在父类静态数据初始化完成后,子类静态数据也会被初始化。同样,这些静态数据在整个类层次结构中只会初始化一次。 子类构造函数:最后,子类构造函数被调用。...子类构造函数通常会首先调用父类构造函数,然后执行子类自己初始化操作。 字段初始化:在构造函数执行期间,类实例字段(非静态字段)会被初始化。...实例化顺序总结 通过上述示例和步骤分析,我们可以总结类实例化顺序如下: 父类静态数据初始化。 父类构造函数,包括父类字段初始化。 子类静态数据初始化。

37120

为什么final引用不能构造函数内“逸出”

前面我们提到过,写final域重排序规则可以确保:在引用变量为任意线程可见之前,该引用变量指向对象final域已经在构造函数中被正确初始化过了。...其实要得到这个效果,还需要一个保证:在构造函数内部,不能让这个被构造对象引用为其他线程可见,也就是对象引用不能构造函数中“逸出”。...这里操作2使得对象还未完成构造前就为线程B可见。...即使这里操作2是构造函数最后一步,且即使在程序中操作2排在操作1后面,执行read()方法线程仍然可能无法看到final域被初始化后值,因为这里操作1和操作2之间可能被重排序。...比如被final修饰方法,JVM会尝试为之寻求内联,这对于提升Java效率是非常重要。因此,假如能确定方法不会被继承,那么尽量将方法定义为final

46400

java静态属性,静态块,构造函数执行顺序

今天为了搞清楚实例化一个对象时其属性等实例化顺序,写了下面的例子来探究: 实例化一个C对象,其中,A为其静态属性,B为其普通属性;D为C父类,E为D静态属性,F为D普通属性;C中还包含了静态代码块和普通代码块.../** * 静态代码块先于构造器执行 普通块先于构造块 只执行一次 * 凡是静态与对象无关,先于对象存在; 凡是静态都是共享 */ B b = new B(); static...public C(){ System.out.println("构造函数C"); } } 运行结果: -------第1次实例化------- 父类静态属性E 构造静态属性A 静态代码块...父类普通属性F 构造父类D 构造普通属性B 普通代码块 构造函数C -------第2次实例化------- 父类普通属性F 构造父类D 构造普通属性B 普通代码块 构造函数...C 结论(实例化顺序): 父类静态属性 父类静态代码块 子类静态属性 子类静态代码块 父类普通属性 父类普通代码块 父类构造函数 子类普通属性 子类普通代码块 子类构造函数 静态东西只在第一次实例化时候执行

1K60

静态代码块、构造代码块以及构造函数加载顺序

构造代码块,和构造函数都存在于一个类中,只不过,他们执行先后顺序和执行次数不同。...构造函数构造函数命名必须和类名完全相同,它没有返回值,也不能用void来修饰。 执行顺序优先级:静态块>main()>构造块>构造方法。...加载时候,将静态成员变量(类变量),构造代码块,静态代码块以及静态方法加载到方法区静态部分,非静态方法以及构造方法加载到方法区静态部分。...接着开始在堆内存中对实例变量进行默认初始化, 然后执行构造代码块,对object进行对应构造代码块初始化, 最后进行构造函数初始化,对object进行对应构造函数初始化。...作用分析 静态代码块用于给类初始化,类加载时候就会被执行; 构造代码块用于给对应对象初始化,只要创建对象就会被执行,而且执行顺序优先于构造函数构造函数用于给对应对象初始化,只要创建对象,就会选择相应构造函数进行初始化

69220

Nginx 不能访问 (找不到)Django 静态文件原因

配置) 现象 访问静态文件 网页状态码为:404 首先要用 F12,查看 静态文件路由,然后用 这个路由 去 静态文件目录 找这个文件是否存在。.../static_root) Nginx 配置静态文件路径没使用 django 项目的 settings.py 里 STATIC_ROOT 指向目录 Nginx 配置规则屏蔽了 js、css 等结尾静态文件...django 项目的 settings.py 里 STATIC_ROOT 不是独立目录,确保是独立目录而不是 py 语句(如:STATIC_ROOT = 'static_root/' ,然后重新收集静态文件...755 /root/home/djangoprojects/djangoblog) 静态文件对应路径下,文件不存在(路由没错,文件不存在,可能是没有收集到 static_root 目录下,重新收集静态文件...:python manage.py collectstatic) 静态文件对应路由拼错了(路由错了,文件存在) 静态文件配置 静态文件管理官网文档 https://docs.djangoproject.com

2.8K30

idea中JSP页面不能访问静态资源(图片,js,css) 作用

必须配置SpringMvc对访问静态资源支持,idea默认就是在main/webapp 下文件路径,要在web-info同级resource文件下放置,JSP中 ${pageContext.request.contextPath...作用   优雅REST风格资源URL不希望带 .html 或 .do 等后缀.由于早期Spring MVC不能很好地处理静态资源,所以在...进行筛查,如果发现是静态资源请求,就将该请求转由Web应用服务器默认Servlet处理,如果不是静态资源请求,才由DispatcherServlet继续处理。...在接收到静态资源获取请求时,会检查请求头Last-Modified值,如果静态资源没有发生变化,则直接返回303相应状态码,提示客户端使用浏览器缓存数据,而非将静态资源内容输出到客户端,以充分节省带宽...js这两个资源目录,在images下面有bg.gif图片,在js下面有test.js文件,则可以通过 /resources/images/bg.gif 和 /resources/js/test.js 访问这二个静态资源

4.9K30

浅析java构造函数访问限定符问题

曾经一直有个问题困扰着我,我一直以为构造函数前面不能加任何东西,但偶然间看到了一本书上写代码中,构造函数前加了public限定符,心里很是疑惑,构造函数前加毛访问限定符啊??!  ...class HolidaySked{ BitSet sked; private HolidaySked(){ // 此处将HolidaySked类构造函数声明为...System.out.println("Error: "+nfe.getMessage()); } } } } 在此 ,我只测试了private限制构造函数...,事实证明,同一个包中不同类是无法实例化带有private构造函数, 其他几个限定符protected ,public 和一般函数限定情况是一致,感兴趣可自行测试。...也就是说,若一个类构造函数声明为private,只有是无法实例化对象,默认访问限定符只能包内声明对象(已测试),而public可以全局声明对象。

72650

两个简单例子学会使用Java中Enum实例1实例2(带构造函数)什么时候使用Enum

一个enum就像其他类一样,可以拥有一系列实例。 下面我们会举几个简单例子说明如何使用Java中enum。...Paste_Image.png 实例2(带构造函数) package Enum; public class Test { public static void main(String[] args...我们知道Java中enum定义是像其他类一样,只是多了一系列预定义实例。...一个适合使用场景是:防止不可用参数,例如下面这个例子: public void doSomethingWithColor(int color); 我们在使用函数时候发现这个参数是很模糊,我们不知道不同颜色对应什么...int值,所以传错参数,但我们如果使用enum,就可以使其变得简单易读: public void doSomethingWithColor(Color color); 根据我们上面定义enum color

54220

IDEA启动静态web服务不能使用ip访问解决办法

前言 在开发react native程序时候,使用夜神模拟器中app调用本地IDEA中启动html文件,出现一些问题。...问题描述 模拟器中程序无法使用ip访问本地IDEA中启动html静态文件,并且在IDEA中设置了允许访问依然不行 原因及解决办法 IDEA中启动html无法被外部访问,即使用IP访问原因是IDEA...中默认没有开启,为了安全性考虑,IDEA服务不允许被外部访问。...新问题: 然后大家会发现,依然不能访问,这是什么原因呢? 原因: 经过多次尝试发现10000以上端口,都不能使用ip:端口进行访问。...解决方法:所以将默认63342端口更改成10000以下端口号即可,如9999,注意不要和系统端口冲突。 至此,html文件已经可以使用ip:端口进行访问

3.2K50

静态初始化块即将纳入ES2022,我们先一睹为快

为了建立一个类实例,在JavaScript中有两个结构: 字段:创建(可选择初始化)实例属性。 构造函数:在 setup 完成之前执行代码块。 对于类静态部分设置,我们只有静态字段。...ECMAScript建议为类引入静态初始化块,大致上,它对静态作用就像构造函数对实例作用。 1.为什么我们需要类中静态块?...initializeTranslator() 不能访问 Translator 私有数据。 通过提出静态块(A行),我们有更优雅解决方案。...3.详情 静态具体内容相对来说是合乎逻辑(相比之下,实例成员规则更为复杂): 每个类可以有一个以上静态块。 静态执行是与静态字段初始化器执行交错进行。...6.总结 类静态块是一个相对简单功能,它完善了类静态功能。粗略来说,它是实例构造函数静态版本。它主要在我们需要设置一个以上静态字段时有用。

17820

子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行先后顺序是?

(1)子类A继承父类B, A a = new A(); 则: 父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式调用了父类构造函数...,但是该类继承自A,所以要先调用父类构造方法,这里通过super(“B”)显示调用了父类带参构造。...执行父类带参构造前要先对父类中对象进行初始化,对父类中c成员进行初始化,调用了C类无参构造,所以调用顺序为: 先调用C类无参构造 再调用A类带参构造 最后调用调用子类构造 (3...)在JVM调用mian方法之前先用进行静态内容初始化。...顺序为:父类静态变量, 父类静态代码块 ,子类静态变量,子类静态代码块。

2.1K30

多个类多线程环境下静态构造函数执行顺序

网上很多资料说到静态构造函数,但是很少提到与线程相关,这个例子实际上是想测试一下静态构造函数多线程冲突。 其实,这个问题源自于XCode v7.3中一个隐秘BUG。...实体类A静态构造函数中可能会开一个线程去执行方法B,然后静态构造函数接着执行后续方法C,问题就在于B和C都会争夺同一个锁,如果B拿到这个锁,它会创建一个A实例,但是因为A静态构造函数正常执行C,C...TEntity静态构造函数。...答案: 上面微软答复邮件说得很清楚,静态构造函数只会被调用一次,并且在它执行完成之前,任何其它线程都不能创建这个类实例或使用这个类静态成员!...这里面包含几层一次: 1,静态构造函数只会被调用一次,并且在所有对该类访问之前。这一点我确信99.99%的人都知道。 2,“其它线程”。

84570

详解Java构造方法为什么不能覆盖,我钻牛角尖病又犯了....

构造顺序图 ? 三 但是,看了输出,我就纳闷为什么为什么第三行不是BigEgg2.Yolk(),不能覆盖吗?...那么,他们构造方法为什么不能覆盖,都是Public Yolk(){}。 当然,网上都说子类继承父类除构造方法以外所有方法,但这是结果,我要知道为什么!! 五 先说几个错误观点 1....有说构造方法方法名与类名必须一样,父子类不能同名,故不能继,所以不能覆盖构造方法。 这个不用多说,这个例子,就是大神写出来打这样说的人。 2....有说因为子类继承父类时候,先运行父类构造函数;具体说就是运行父类时就会先“调用”父类构造函数,注意“调用”和继承不是一个含义,实质上是“自动运行”。...这个强行用中文语法来解释,达到中文6级了啊。 3. 有说构造方法不是成员函数,故不能继承,所以谈不上覆盖。 这个真的有道理,是java官方文档上。大多数人找到这里估计就满足了。

2K20
领券