3

private修飾子は、メンバーがそれ自体のクラスでのみアクセスできることを指定します。しかし、基本クラスから継承されるパブリックメソッドを使用してアクセスできますか?誰かが私に理由を説明できますか?これは、Childクラスのオブジェクトにbというメンバーが含まれていることを意味しますか?

コードは次のとおりです。

package a;

public class Base {
    private int b;

    public int getB() {
        return b;
    }

    public void exposeB() {
        System.out.println(getB());
    }

    public Base(int b) {
        this.b = b;

    }
}

package b;

public class Child extends Base {

    Child(int b) {
        super(b);
    }

    public static void main(String args[]) {
        Child b = new Child(2);
        // Prints  2
        System.out.println("Accessing private base variable" + b.getB());
    }
}
4

5 に答える 5

5

スーパークラスのプライベート変数に直接アクセスしていません。カプセル化の概念を実装しています。パブリックゲッターメソッド(この場合はgetB())を使用して、プライベートデータに他のクラスがアクセスできるようにします。したがって、パブリックゲッターを介してプライベート変数bにアクセスできますが、別の/サブクラスからそのインスタンスで直接bにアクセスすることはできません。

于 2012-09-27T22:38:33.507 に答える
2

クラスBaseでは、フィールドbはプライベートですgetB()がパブリックであるため、誰でもそのメソッドを呼び出すことができます。

コンパイルに失敗すると予想されるのは、次のようなものです

System.out.println( "Accessing private base variable" + b.b );

Base(その行がそれ自体のメソッド内から呼び出されない限り)。

于 2012-09-27T22:25:59.910 に答える
2

なので、b 直接アクセスすることはできません。ただし、基本クラスのメソッドを使用することはできます(したがって、どこからでも呼び出すことができます)。ChildprivategetBpublic

パッケージ内の拡張クラスと他のクラスのみがフィールドにアクセスできるようにするには、フィールドをとして宣言しprotectedます。


class A {
    private int n;
    public A(int n) { this.n = n; }
    public int n() { return n; }
}

class B extends A {
    public B(int n) { super(n); }
    public void print() { System.out.println(n); }  // oops! n is private
}

class A {
    protected int n;
    public A(int n) { this.n = n; }
    public int n() { return n; }
}

class B extends A {
    public B(int n) { super(n); }
    public void print() { System.out.println(n); }  // ok
}
于 2012-09-27T22:26:39.937 に答える
0

プライベート修飾子は、クラスの外部でそのフィールドを参照できないことを意味します。ただし、getB()はパブリックであるため、そのメソッドを参照できます。getB()メソッドは、クラス内にあるため、プライベートbフィールドを参照できます。したがって、このフィールドにアクセスできます。

于 2012-09-27T22:21:16.260 に答える
0

プライベート変数は、そのクラスから変数に直接アクセスできないことを意味します。変数privateを宣言することは、これを実行できないことを意味します。

Myclass.myprivatevariable = 3

これにより、myprivatevariableが外部から表示されないことを示すコンパイルエラーがスローされます

しかし、あなたがしたように....内部メソッドをgetterまたはsetter、publicとして宣言すると、そのメソッドを介してのみ、ユーザーがその変数に間接的にアクセスできるようになります...これは常に推奨される方法です。

于 2012-09-27T22:26:27.587 に答える