私人会员可通过公共方式访问

时间:2012-09-27 22:17:13

标签: java oop inheritance

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());
    }
}

5 个答案:

答案 0 :(得分:5)

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

直接访问其实例上的 b

答案 1 :(得分:2)

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

可以期望编译失败的内容类似于:

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

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

答案 2 :(得分:2)

您将无法在b中直接访问<{1}} ,因为它是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
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

私有变量意味着您无法直接从其类中访问该变量。声明该变量为private意味着您无法执行此操作

Myclass.myprivatevariable = 3

这会抛出一个编译错误,抱怨myprivate变量从外面看不到

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