1

「パブリック」または「保護された」メソッドは、インターフェイスを実装しないプライベートのネストされたクラスには何の違いもありません..?

入れ子になったプライベート クラスがインターフェイスを実装していないか、クラスから継承していない場合、そのメソッドの修飾子については、「パブリック」または「保護」されているか、修飾子がなくても違いはないように見えます。コンパイラがそれらに対してのみ「プライベート」を許可する場合は、より理にかなっています。では、なぜJavaはそれらを許可するのでしょうか?

class Enclosing {

    private class Inner {
        private void f1() {}
        void f2() {}
        protected void f3() {}
        public void f4() {}
    }

    void test() {
        Inner o= new Inner();
        o.f1();
        o.f2();
        o.f3();
        o.f4();
    }
}
4

2 に答える 2

2

これが私が試したものです:

public class Test {

    public void method(){

        Innerclass ic = new Innerclass();
        InnerClass2 ic2 = new InnerClass2();
        System.out.println(ic.i);
        System.out.println(ic.j);
        System.out.println(ic.k);
        System.out.println(ic.l);

        System.out.println(ic2.i);  // Compile Error
        System.out.println(ic2.j);
        System.out.println(ic2.k);
        System.out.println(ic2.l);
    }

    private class Innerclass{

        private int i;
        public int j;
        protected int k;
        int l;

    };

    private class InnerClass2 extends Innerclass{

    }

}

上記のように、これには1つのエラーがあります。

  1. 内部クラスがプライベートであっても、内部クラスのすべてのメンバーは、可視性/アクセス修飾子に関係なく、包含/外部クラスにアクセスできます。
  2. ただし、ある内部クラスが別の内部クラスを拡張している場合、アクセス修飾子は重要です。
  3. これらは、継承によって関連付けられたクラスに適用される一般的な継承ルールです。
  4. したがって、javaはプライベート内部クラスのすべてのアクセス修飾子を許可します。
于 2012-05-11T06:27:15.097 に答える
0

privateクラス スコープを介したアクセスのみを意味します。このルールがネストされたクラスに適用されないというのは、論​​理的ではありません。

を除いて、ネストされたクラスの他のタイプを定義しませんprivate。そして、私が作った親クラスからアクセスしたいメンバーpublic

于 2012-05-11T06:05:30.240 に答える