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