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

您没有直接访问超类中的私有变量。您正在实施封装的概念。您正在使用公共 getter 方法(在本例中为 getB())使您的私有数据被其他类访问。因此,您可以通过公共 getter 访问私有变量 b,但您永远不能直接从另一个/子类访问b

于 2012-09-27T22:38:33.507 回答
2

在 classBase中,该字段b是私有的,但getB()也是公共的,因此任何人都可以调用该方法。

可以预期编译失败的情况如下:

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

(除非该行是从其Base自身的方法中调用的)。

于 2012-09-27T22:25:59.910 回答
2

您将无法b 直接访问,Child因为它是private. 但是,您可以使用基类的getB方法public(因此可以在任何地方调用)。

允许扩展包中的类和其他类访问该字段,您可以将其声明为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

private 修饰符意味着您不能在类之外引用该字段。但是,因为 getB() 是公共的,所以您可以引用该方法。getB() 方法可以引用私有 b 字段,因为它在类内部,因此可以访问它。

于 2012-09-27T22:21:16.260 回答
0

私有变量意味着您不能直接从其类中访问该变量....声明该变量私有意味着您不能这样做

Myclass.myprivate 变量 = 3

这将引发编译错误,抱怨 myprivatevariable 在外部不可见

但是,正如您所做的那样……将内部方法声明为 getter 或 setter、public,您就允许用户仅通过该方法间接访问该变量……这始终是首选方法。

于 2012-09-27T22:26:27.587 回答