4
public enum Parent {
    item1(1){

        public void testing() {
            add();
            multiply();
            minus(); // error here!!!
        } 

    }, item2(2);

    private int i ;
    Parent(int i){
        this.i = i;
    }

    public void setI(int i ){
        this.i = i;
    }
    public int getI(){
        return i;
    }

    public void multiply(){

    }
    protected void add(){

    }

    private void minus(){

    }
}

大家看到了,他们是同一个班的,怎么minus()不能在内部使用呢?通常内部类可以private method/field在外部类中访问吗?

4

3 回答 3

8

为了能够从 访问minus()item1您必须成功protected(或public)。

正确的思考方式Parentitem1作为基类和子类。

JLS

枚举常量的可选类主体隐式定义了一个匿名类声明(第 15.9.5 节) ,该声明扩展了直接封闭的枚举类型

于 2012-11-30T07:53:30.923 回答
3

实际上发生的情况是,当您在创建枚举对象时提供实现时,您基本上是在Parent使用额外的方法扩展类,即匿名实现。所以它不允许访问Parent类的私有方法,但允许protectedand public

enum A{
        a{
            @Override
            public void method() {
                // TODO Auto-generated method stub
                super.method();
            }
        };


        public void method(){

        }
    }

这应该解释看@Overrideeclipse提供的注释。

于 2012-11-30T07:59:11.853 回答
1

问题是“item1”不是Parent的内部类,它实际上是顶级类。要验证 item1 生成的类,它是 Parent$1.class,如果它是一个内部类,它将是 Parent$item1.class

于 2012-11-30T07:55:06.320 回答