Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名\具体子类是否继承抽象父私有字段?_Java_Oop_Inheritance_Abstract Class - Fatal编程技术网

Java 匿名\具体子类是否继承抽象父私有字段?

Java 匿名\具体子类是否继承抽象父私有字段?,java,oop,inheritance,abstract-class,Java,Oop,Inheritance,Abstract Class,我理解抽象类不能被实例化。然而,如果我们编写下面所示的代码,它将实例化抽象父类的匿名子类。根据Java规范,子类对象不应该有权访问其父私有成员 让我困惑的是,匿名子类对象能够通过打印存储在“i”中的值来访问抽象父类的private字段。我有什么误解 public class Main { public static void main (String [] args){ B myB = new B() {}; myB.print(); }} public abstr

我理解抽象类不能被实例化。然而,如果我们编写下面所示的代码,它将实例化抽象父类的匿名子类。根据Java规范,子类对象不应该有权访问其父私有成员

让我困惑的是,匿名子类对象能够通过打印存储在“i”中的值来访问抽象父类的private字段。我有什么误解

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);
}}

这很好,因为
i
是通过
B
中的方法访问的。另一个类中的代码正在调用
print()
,这一事实并不重要;可见性修改器仅影响直接访问

(您不需要匿名子类来显示这一点;您可以在具体类中看到同样的效果。)


这就是封装的工作原理:如果不同的类不能在使用私有字段的其他类中调用方法,那么它们就很难以高效的方式相互使用。
B
有责任实现其
public
方法,使其私有字段不会受到调用这些方法的不利影响。

这很好,因为
i
B
中的方法访问。另一个类中的代码正在调用
print()
,这一事实并不重要;可见性修改器仅影响直接访问

(您不需要匿名子类来显示这一点;您可以在具体类中看到同样的效果。)

这就是封装的工作原理:如果不同的类不能在使用私有字段的其他类中调用方法,那么它们就很难以高效的方式相互使用。
B
有责任实现其
public
方法,使其私有字段不会受到调用这些方法的不利影响