2

派生クラスにまったく公開されないように、または少なくともサブクラスがを呼び出すまで、クラスのメンバーを宣言できるかどうか知りたいですsuper()。Javaにそのような機能はありますか?

 class A{
      static int foo = 1;
    }

    class B extends A{
      public B(){
         System.out.print(foo);/// how do I make this not work?
      }
    }

編集:私は実際に私の質問を解決策とともに入力しました(私の実際のコードにはプライベートがありませんでした)。だから私は私の質問を編集し、それが意味のある質問になるようにプライベートを削除します:)

4

4 に答える 4

3

それはすでに機能しません - メンバーは非公開であるため、B からは見えません。

ただし、サブクラスで既に表示されているメンバーを非表示にしようとしている場合、たとえば

public class A {
    public void foo() {
        // Whatever
    }
}

public class B extends A {
    // ???
}

...
B b = new B();
b.foo(); // I don't want this to work, because it's a B!

...それではできません。それはリスコフの代替原理を破るでしょう。

于 2013-03-15T22:17:45.923 に答える
2

foo質問の解釈の 1 つは、アクセスを失敗させたいが、アクセスsuper.fooを成功させたいというものです。これは、A と B の両方が同じトップ レベル クラスに含まれている場合、またはそれらの一方が他方を囲むトップ レベル クラスである場合など、特定の状況で発生する可能性があります。

class X

    class A  
        private int foo;

    class B extends A

        print(foo);           // fail
        print(super.foo);     // ok  
        print(((A)this).foo); // ok...

また

class A
    private int foo;

    static class B extends A    // declared inside A

        print(foo);           // fail
        print(super.foo);     // ok  
        print(((A)this).foo); // ok...

その理由は、そのプライベート メンバーは継承されないため、this.foo存在しないためです。ただし、適切な修飾子を使用すると、トップレベルのクラス全体でアクセスできるため、A.fooアクセス可能です。http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1-100-D-3を参照してください。

于 2013-03-15T22:31:00.490 に答える
1

変数を次のようにマークするとprivate、サブクラスはそれにアクセスできなくなります。

static(また、おそらくfoo 宣言には入れたくないでしょう。)

于 2013-03-15T22:18:02.723 に答える
1

アクセス修飾子 (たとえば、メンバーを であると宣言するprivate) は、メンバーへのアクセスを実際に防止する唯一のものです。(それでも、リフレクションを使用してプライベート メンバーを取得できます。)


について言及するとき、Java の意味での非表示superの使用を考えているかもしれません。たとえば、元の宣言を隠すために呼び出される何かを宣言する場所。ただし、ここでは役に立ちません。foo

  • foo2 番目の inまたは... extends ... extendsなどBのサブクラスを宣言する必要があります。CACB

  • これらは static であるため、常に元のas にBアクセスできます。実際、推奨されるアプローチであるため、この (仮説的な) 隠蔽の使用は、価値のあるものを何も達成していません (IMO)。fooA.foo<class>.<name>

  • それが機能する範囲であっても、それは単に 1 つfooを別のものに置き換えるだけfooであり、これはユースケースが必要とするものではありません.

要するに、隠すことは、露出を減らしたり制御したりする有効な手段ではありません。

于 2013-03-15T23:36:10.367 に答える