栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何通过重写方法在Java枚举中使用字段?[

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何通过重写方法在Java枚举中使用字段?[

专门

enum
的不过是具有内部类语义的子类。如果在编译后查看字节码,您会注意到编译器仅插入用于读取私有字段的访问器方法,但是任何专用枚举都被编译为自己的类。您可以考虑将
enum
其实现为:

public abstract class MyEnum {  private static class First extends MyEnum {    @Override    public String doIt() {        return "1: " + someField; //error    }  }  private static class Second extends MyEnum {    @Override    public String doIt() {        return "2: " + someField; //error    }  }  public static final MyEnum FIRST = new First();  public static final MyEnum SECOND = new Second();  private String someField;  public abstract String doIt();}

如您所见,发生相同的编译器错误。实际上,您的问题与

enum
s 不相关,而与它们的内部类语义有关。

但是,您发现了编译器的一个极端情况,即猜测您的代码意图并试图警告您您的意图是非法的。通常,

someField
任何专业人士都可以看到该字段
enum
。但是,有两种
private
从内部类访问字段的方法,只有一种是合法的:

  1. private
    成员不继承。因此,在超类中定义实例后,您将无法访问该
    private
    字段
    this

  2. 对于内部类,即使外部类的成员也可以访问

    private
    。这是由编译器通过将访问器方法插入外部类(
    private
    通过访问器方法公开字段)来实现的。
    static
    仅当内部类为non-时,才能访问non- field
    static
    。对于
    enum
    s,内部类始终为
    static

更高的条件是编译器抱怨的是:

无法静态引用非静态字段

someField

您正在尝试

static
static
内部类访问非字段。即使该字段由于内部类的语义而在技术上是可见的,也是不可能的。您可以通过例如从超类读取值来明确指示编译器访问该值,例如:

public String doIt() {  MyEnum thiz = this;  return thiz.someField;}

现在,编译器知道您正在尝试访问可见(外部)类型的成员,而不是错误地访问

someField
(非静态)外部类实例(不存在)的字段。(类似地,您可以编写
super.someField
该表述,表达了您想继承继承链而不访问外部实例字段的想法。)但是,更简单的解决方案是简单地使field成为可能
protected
。这样,编译器对继承可见性感到满意,并可以编译您的原始设置。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453646.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号