0

私はちょうどこれについて興味があります。私はこれを正しく理解していないかもしれません。ただし、Java ではデータ メンバーの可視性を下げることはできますが、メンバー関数の可視性を下げることはできないようです。パブリック データ メンバーとパブリック関数を持つ Parent クラスがあります。Child クラスのメンバー関数の可視性を下げると、許可されません。ただし、データメンバーの可視性を減らしても文句はありません。

  1. 私はこれを正しく理解していますか?そうでない場合、どこが間違っていますか?
  2. もしそうなら、なぜデータ メンバーの可視性の削減が許可されているのですか?

ここに私が書いたいくつかのコードがあります

class Parent {

    public int dataMember = 20;

    public void function () {
        System.out.println ("Called parent");
    }
}    
public class Child extends Parent {

    private int dataMember = 10;  // Reduces visibility OK

    @Override
    //protected void function () { // Reduces visibility NOT OK
    public void function () {
        System.out.println ("Child class call" );
        System.out.println("Child dataMember = " + dataMember 
                           + " Parent dataMember" + super.dataMember);
    }

    public static void main(String[] args) {

        Child c = new Child ();
        c.function();
        Parent p = new Parent ();
        System.out.println ("Parent data member = " + p.dataMember);
    }

}

派生クラスからデータ メンバーにアクセスできなくなります。子クラスの参照を介して親クラスの「dataMember」にアクセスする方法はありますか?

public class Another {

    public static void main(String[] args) {

        Child c = new Child ();

        // Cannot access dataMember as expected
        //System.out.println("Child dataMember = " + c.dataMember);

        // Can access dataMember through parent object as expected
        Parent p = new Parent ();
        System.out.println("Parent dataMember = " + p.dataMember);

    }
}
4

4 に答える 4

4

class という名前の新しいインスタンス変数を宣言することにより、スーパークラスのインスタンス変数をx隠していますChildx

クラス内で、スーパークラスのフィールドと同じ名前を持つフィールドは、型が異なっていても、スーパークラスのフィールドを非表示にします。サブクラス内では、スーパークラスのフィールドを単純な名前で参照することはできません。代わりに、 を通じてフィールドにアクセスする必要がありますsuper詳細については、チュートリアルを参照してください。

クラスでメソッドを次のように記述できますChild

public int getParentDataMember() {
    return super.dataMember;
}

そして、メンバーに次のようにアクセスします。

System.out.println("Child dataMember = " + c.getParentDataMember());
于 2013-06-08T22:01:58.767 に答える
0

同じ変数名を使用すると、実行時にバインディングが発生する methods() とは異なり、シャドウ変数になるため、変数の可視性を減らすことができます..

したがって、親オブジェクトから public メソッドを呼び出すことができますが (それが子のインスタンスであっても)、子がメソッドを private にすることを許可されている場合、これは不可能です。

于 2013-06-08T22:04:31.907 に答える
0

dataMember子クラスのメンバーは、可視性を低下させるのではなく、親クラスのメンバーを隠しています。

それは簡単に確認できます。getter を Child クラスに追加します。

public int getDataMember() { return dataMember; }

そして、メインメソッドで:

public static void main(String[] args) {
    Parent p = new Parent();
    System.out.println(p.dataMember); // 10
    Child c = new Child();
    System.out.println(c.getDataMember()); // 20
}
于 2013-06-08T22:06:39.087 に答える
0

オーバーライドされたメソッドの可視性を下げることはできません。それが法律です。あなたの親があなたがサービスを実行すると言ったら、あなたがしたいかどうかにかかわらず、あなたはそれを実行します. このメソッドを実装したくない場合は、間違ったクラスから継承しています。

また、親クラスの変数と同じ名前で子クラスの変数を宣言することは本当に良い考えではありません。見えにくくなります。

Java にはいくつかの可視性レベルがあります。private は、宣言されているクラス以外の誰もこれを見ることができないことを意味します。protected は、クラスを宣言していて、派生クラス (子) がそれを見ることができることを意味します。package (キーワードがない -- 可視性を指定しないままにしておく)。これは、宣言するパッケージ内のすべてのクラスがそれを見ることができることを意味します。public、つまり、どこにいてもどのクラスでもアクセスできます。

于 2013-06-08T22:11:28.380 に答える