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());
}
}
答案 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,你只允许用户通过该方法间接访问该变量......这总是首选方式做。