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を作成する必要があります。protectedpublic

Parentandの正しい考え方item1は、基本クラスとサブクラスです。

JLSから:

列挙型定数のオプションのクラス本体は、直接囲んでいる列挙型を拡張する匿名クラス宣言 (§15.9.5) を暗黙的に定義します。

于 2012-11-30T07:53:30.923 に答える
3

実際には、enum オブジェクトの作成中に実装を提供すると、基本的にParentクラスを追加のメソッド、つまりAnonymous実装で拡張することになります。Parentしたがって、クラスのプライベート メソッドへのアクセスは許可されませんが、許可されprotectedますpublic

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


        public void method(){

        }
    }

これは@Override、Eclipseによって提供される注釈を参照してください。

于 2012-11-30T07:59:11.853 に答える
1

問題は、「item1」が親の内部クラスではなく、実際には最上位クラスであることです。item1 の生成されたクラスを確認するには、Parent$1.class です。内部クラスの場合は、Parent$item1.class になります。

于 2012-11-30T07:55:06.320 に答える