Java 访问嵌套类中的外部类对象

Java 访问嵌套类中的外部类对象,java,Java,下面的代码是访问内部类中的外部类对象的合法方法吗?谢谢 Class A{ A self; public A(){ this.self=self; } public void test(){} Class B{ public void test2(){ self.test(); } } } 不需要“自我”参照;只是test()将完成任务 未标记为static的内部类具有外部类类型的秘密不可见字段(因此,在您的示例中,a),它是构造函数的第一个参数。当您在一个上下文中调用ne

下面的代码是访问内部类中的外部类对象的合法方法吗?谢谢

Class A{
A self;
public A(){
this.self=self;
}
public void test(){}


 Class B{
   public void test2(){
   self.test();
}
 } 
}

不需要“自我”参照;只是
test()将完成任务

未标记为
static
的内部类具有外部类类型的秘密不可见字段(因此,在您的示例中,
a
),它是构造函数的第一个参数。当您在一个上下文中调用
new B()
时,该
的某个变体将引用a的一个实例,然后该实例将被静默地注入。如果没有这样的“this”,那么
new B()
是非法的,不会编译;在这种情况下,传递secret参数的语法是
someInstanceOfA.new B()

java中任何不合格的方法调用(因此只需
foo()
,vs
something.foo()
)都将首先检查它在
上是否有意义,如果没有,在这些机密字段中是否有意义

加在一起,然后:

  • B有一个A型不可见场
  • test()
    将是一个非限定调用,而B()本身没有
    test()
    方法,因此,
    InvisibleField.test()
    是它的工作方式
注意:您的代码并不“更清晰”,因为您的代码还使用了不可见字段:
self
得到了相同的处理,并最终解析为
thatInvisibleInstanceOfA.self
,以使其有意义


NB2:作为一般的经验法则,内部类应该标记为
静态
,即使您需要外部的东西:然后将不可见字段显式化(将一个实际的
私有的final a a;
字段,并在B的构造函数中设置)-非静态内部类令人惊讶,而隐藏字段会导致问题。例如,任何仍然处于活动状态的B实例都将阻止A的垃圾收集,即使您的内部类根本不使用该实例。只有当您真正知道自己在做什么并且真正有意义(很少有意义)时,才使用非静态内部类。

为什么不尝试一下呢?这是一个很好的想法,我假设它是在正确的对象上调用的?谢谢,如果你的
B
也有一个
test()
方法,它会运行这个方法,但只要它没有,javac就会假定唯一一个“有效”的方法是
a
。在阴影情况下(其中B和A都有此方法),
A.this.test()
将执行此操作。