Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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 从构造函数中公开“this”的引用_Java_This_Inner Classes - Fatal编程技术网

Java 从构造函数中公开“this”的引用

Java 从构造函数中公开“this”的引用,java,this,inner-classes,Java,This,Inner Classes,根据文章,在下面的示例中,建议隐式转义对它的引用 现在,非静态内部类的实例只能使用外部类的实例来构造,下面的示例中,在EventListener2的构造函数中,创建了一个新的EventListener实例,因此这是如何隐式转义的。我知道内部类包含对外部类的隐式引用,但这里的要点是,根据文章,这是隐式转义的,我无法理解这是如何转义的,我同意不完全构造的EventListener是转义的,但不能同意这一点 public class EventListener2 { public EventLis

根据文章,在下面的示例中,建议隐式转义对它的引用

现在,非静态内部类的实例只能使用外部类的实例来构造,下面的示例中,在EventListener2的构造函数中,创建了一个新的EventListener实例,因此这是如何隐式转义的。我知道内部类包含对外部类的隐式引用,但这里的要点是,根据文章,这是隐式转义的,我无法理解这是如何转义的,我同意不完全构造的EventListener是转义的,但不能同意这一点

public class EventListener2 {
  public EventListener2(EventSource eventSource) {

    eventSource.registerListener(
      new EventListener() {
        public void onEvent(Event e) { 
          eventReceived(e);
        }
      });
  }

  public void eventReceived(Event e) {
  }
}

你接近理解了。不仅仅是非静态内部类在没有对封闭类的引用的情况下不能被实例化。非静态内部类的实例实际上包含对封闭类的关联实例的引用。因此,在这里,您的匿名EventListener包含对封闭的EventListener2实例的引用

为了理解为什么这是一个问题,考虑EnvithListN2可能有一些其他事件所需要的字段。假设在调用registerListener时,这些其他字段尚未初始化。。。。通过注册接收者,可以接收事件。。。在EventListener2完全初始化之前调用