私有成员通过公共方法可访问。

3

私有修饰符指定成员只能在其自身的类中访问。但是,我是否可以使用从基类继承的公共方法来访问它?有人能解释一下吗?这是否意味着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());
    }
}
5个回答

5

你没有直接访问超类中的私有变量,而是实现了封装的概念。你使用公共getter方法(在这种情况下是getB())使其他类可以访问你的私有数据。因此,你可以通过公共getter访问私有变量b,但你永远不能从另一个/子类的实例直接访问b


@Brian 谢谢:)我记得这是一年前我面试时的一个问题... :) - PermGenError
@questborn 没关系,不要忘记选择最佳答案,因为这里有很多回答。 :) - PermGenError

2

因为 Child 的访问权限是 private,所以您无法直接访问 b 。不过,您可以使用基类的 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
}

+1对于词语“直接访问”,这点应该更加强调,可以通过一个示例说明直接访问如何允许操作。 - Brian

2
在类Base中,字段b是私有的,但getB()是公共的,因此任何人都可以调用该方法。
可以预期编译失败的内容如下:
System.out.println( "Accessing private base variable" + b.b );

(除非该行代码是从 Base 类的方法内部调用的。)

0
私有修饰符表示在类外部无法引用该字段。但是因为getB()是公共的,所以可以引用该方法。getB()方法可以引用私有字段b,因为它在类内部,并因此可以访问它。

0

私有变量意味着你不能直接从它的类访问该变量... 声明该变量为私有意味着你不能这样做

Myclass.myprivatevariable = 3

这将抛出一个编译错误,抱怨 myprivatevariable 在外部不可见

但是,正如你所做的那样.... 把内部方法声明为 getter 或 setter,公共的,你允许用户只通过那个方法间接地访问该变量... 这总是首选的方法。


这意味着父类中的私有变量被继承到子类中,因为我能够使用子对象来操作它? - questborn
不,不完全是这样的...在这种情况下,子类继承了父类的公有方法**getB()**,该方法可以修改父类的私有变量..请查看来自Oracle的此文档:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html - Yngwie89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接