3

プライベート フィールドを持つクラスと、外部クラスの型を拡張するジェネリック型を持つ静的な抽象内部クラスがあります。これは、外部クラスのプライベート フィールドにアクセスしようとしますが、次のエラーが発生します: - エラー: a は外部にプライベート アクセスがあります - エラー: doSomething はアウターでプライベート アクセスを持っています

以下のコードを参照してください。

public abstract class Outer extends SomeOuter
{
    private Object a;
    private void doSomething(){}

    public static absract class Inner<T extends Outer> extends SomeOuter.SomeInner<T> {     
        public InnerMethod(T p) {
            p.a; //error: a has private access in Outer
            p.doSomething() //error: doSomething has private  access in Outer
        }
    }
} 

jdk 1.7を使用してコンパイルしています

なぜこのエラーが発生するのか教えてください。

4

6 に答える 6

3

は、囲んでいるクラスにアクセスInner classでき、 また、囲んでいるクラスのプライベート メンバーにもアクセスできます。private fieldstatic inner class

クラス自体は実際には " static" ではありません。静的クラスのようなものはありません。この場合の静的修飾子は、ネストされたクラスが外部クラスの静的メンバーであることを示しています。つまり、他の静的メンバーと同様に、外部クラスのインスタンスがなくてもアクセスできます。

これは static member であるため、クラス内で private メンバーにアクセスできるため、外部クラスの private members にアクセスできます。

例えば。

class One
{
    private int i=0;
     class Two
    {
         void go()
            {
                System.out.println(new One().i);  //accessible
            }
    }
}
class two 
{
    private  int i=3;
    static class one
    {
        void go()
        {
            System.out.println(new two().i);    //accessible in static class
        }
    }
}

しかし、ここで 、

Inner<T extends Outer> extends SomeOuter.SomeInner<T>

T は Outer を拡張するクラスであり、それが内部であることを意味しません。そのため、エラーが発生しています。

于 2013-06-11T09:31:21.000 に答える
1

使用しようとしているオブジェクトと関数の両方がprivateとして宣言されています。つまり、それらはオブジェクトの外では使用できません。子クラスでも使用する場合は、 protectedとして宣言します。

于 2013-06-11T09:24:02.170 に答える
1

拡張するクラスがこれらのフィールドにアクセスできるように、Outerクラスのフィールドのスコープを に変更します。protectedOuter

public abstract class Outer extends SomeOuter
{
    protected Object a;
    protected void doSomething(){}


    public static absract class Inner<T extends Outer> extends SomeOuter.SomeInner<T> {     
        public InnerMethod(T p) {
            p.a; //error: a has private access in Outer
            p.doSomething() //error: doSomething has private  access in Outer
        }
    }
} 
于 2013-06-11T09:24:38.323 に答える
0

privateそれはあなたが修飾子を持っているものです。内部クラスですが、外部クラスのプライベート メンバーにはアクセスできません。したがって、protected外部クラスを内部クラスに拡張しているため、として宣言します

于 2013-06-11T09:24:52.463 に答える