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

Java 可通过公共方法访问的私有成员,java,oop,inheritance,Java,Oop,Inheritance,private修饰符指定只能在成员自己的类中访问该成员。但我是否能够使用从基类继承的公共方法访问它。有人能解释一下为什么吗?这是否意味着子类的对象包含名为b的成员 代码如下: package a; public class Base { private int b; public int getB() { return b; } public void exposeB() { System.out.println(getB()

private修饰符指定只能在成员自己的类中访问该成员。但我是否能够使用从基类继承的公共方法访问它。有人能解释一下为什么吗?这是否意味着子类的对象包含名为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());
    }
}

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

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

编译失败的原因如下:

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

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

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

Myclass.myprivatevariable=3

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


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

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

要仅允许扩展类和包中的其他类访问该字段,可以将其声明为
受保护




您不能直接访问超类中的私有变量。您正在实现封装的概念。您正在使用公共getter方法(在本例中为getB())使您的私有数据被其他类访问。因此,您可以通过public getter访问私有变量b,但您永远不能从另一个/子类直接访问b,这意味着父类中的私有变量被继承到子类中,因为我可以使用子对象对其进行操作?不,不完全是。。。。子类在本例中,从可以修改父类私有变量的父类继承公共方法**getB()**。。从…处检查此文档。。Oracle+1对于“直接”一词,应该更加强调这一点,也许可以举例说明直接访问如何允许操纵。@Brian Thank:)。我记得这是一年前我工作面试中的一个问题……:)@欢迎提问:)别忘了接受最好的答案,因为这里有很多答案
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
}