需要对私有变量和继承有更多的了解。早些时候我的理解是,如果一个类中有字段,并且当我继承该类时,不受访问(私有变量)限制的字段将存在于继承的类中。但如果有公共 g/setter 方法,我可以在基类中使用私有变量。
我怎么能想象基类中的私有变量。?
需要对私有变量和继承有更多的了解。早些时候我的理解是,如果一个类中有字段,并且当我继承该类时,不受访问(私有变量)限制的字段将存在于继承的类中。但如果有公共 g/setter 方法,我可以在基类中使用私有变量。
我怎么能想象基类中的私有变量。?
这就是 Java 教程http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html所说的:
子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。
尽管如此,看到这个
class A {
private int i;
}
class B extends A {
}
B b = new B();
Field f = A.class.getDeclaredField("i");
f.setAccessible(true);
int i = (int)f.get(b);
i
它工作正常并从 B 实例返回字段值。也就是说,B 有i
。
class A {
private int a;
public A(int a) { this.a = a; }
public int getA() {return a;}
}
class B extends A {
public B(int b) { super(b); }
public int getB() {return getA();}
}
int result = new B(10).getA();
结果将是 10。A 类中的私有字段 a 有点继承给 B,但 B 不能直接访问它。仅通过使用 A 类中定义的公共/默认/受保护的访问器方法。B 是 A,因此它始终具有 A 中的所有相同字段,并且可能在 B 类中定义一些新字段。
私有变量/成员不被继承。这是唯一的答案。
提供公共访问器方法是封装的工作方式。您将数据设为私有并提供获取或设置其值的方法,以便可以控制访问。