我知道抽象类无法实例化。然而,如果我们编写类似下面代码的代码,它将实例化抽象父代的匿名子类。根据Java规范,子类对象不应该有权访问其父私有成员。
让我感到困惑的是,匿名子类对象能够通过打印存储在" i"中的值来访问抽象父类的私有字段。我有什么误解?
public class Main {
public static void main (String [] args){
B myB = new B() {};
myB.print();
}}
public abstract class B {
private int i = 5;
public void print(){
System.out.println(i);
}}
答案 0 :(得分:4)
这很好,因为i
中的方法正在访问B
。 print()
被另一个类中的代码调用的事实并不重要;可见性修饰符仅影响直接访问。
(你不需要匿名子类来显示这个;你会看到与具体类相同的效果。)
这就是封装应该如何工作:如果不能在其他使用私有字段的类中调用方法,那么不同的类很难以生产的方式相互使用。 B
方法有责任实现public
方法,使其私有字段不受被调用方法的不利影响。