[英]Can Anonymous inner class instantiated within a static method has access to instance members of containing class?
我想更好地理解包含类的实例字段对Anonymous内部类(AIC)的可见性。
有很多关于AIC隐含引用包含类的实例的讨论( 当它确实是泄漏安全使用(匿名)内部类时? )。 使用该逻辑,即使在静态方法中实例化AIC,它也应该可以访问包含类的实例字段。 但是由于编译器出错,我无法找到测试方法。
例如,在下面的代码中,我得到:当我在AIC的print()方法中引用's'时,编译器“无法从静态上下文中引用非静态字段' :
public interface TestInterface {
void print();
}
public class AICTest {
public String s = "something";
public static void main( String[] args ) {
new TestInterface() {
@Override
public void print() {
System.out.println( s ); **<-- compilation error**
}
}.print();
}
}
你能否建议AIC实例是否可以在上面的例子中访问's'?
编辑/回答我想澄清一点,我知道静态方法可以访问类成员,实例方法可以访问实例和类成员。 混淆更多的是关于AIC总是隐含引用包含类'对象的一般声明。 对于在静态方法中初始化的AIC,情况显然不是这样。 @shmosel共享一个回答我的问题的链接( 是否有可能在Java静态中创建匿名内部类? ): “因此静态上下文中的匿名类大致相当于静态嵌套类,因为它不保留对封闭的类,即使它在技术上不是静态类。“
你必须有一个AICTest实例才能读出's',因为's'是一个实例变量。 这是一个可行的示例,表示您的示例被修改为访问可能来自任何地方的现有AICTest对象:
class AICTest {
public String s = "something";
public static void main( String[] args ) {
AICTest aic = new AICTest();
new TestInterface() {
@Override
public void print() {
System.out.println(aic.s);
}
}.print();
}
}
要清楚,运行'main'不会创建AICTest的实例。 你必须在某个地方做一个'new'来创建一个AICTest实例。
另一种选择是让's'静止。 然后它不与任何特定的AICTest对象相关联,因此即使您没有实例化AICTest对象它也存在:
class AICTest {
public static String s = "something";
public static void main( String[] args ) {
new TestInterface() {
@Override
public void print() {
System.out.println(s);
}
}.print();
}
}
如您所见,我没有添加任何可见性修饰符。 所以关于可见性的想法是合理的。 如果访问“s”是有意义的,那么代码中就会显示可见性。 这里的问题与可见性无关。
这可能不是你想要的,但你可以:
interface TestInterface {
void print();
}
class AICTest {
public String s="something";
public static void main(String[] args) {
AICTest aicTest=new AICTest();
new TestInterface() {
@Override public void print() {
System.out.println(aicTest.s);
}
}.print();
}
}
混淆更多的是一般的哲学,即AIC总是隐含地引用包含类的对象。 对于在静态方法中初始化的AIC,情况显然不是这样。 @shmosel共享一个回答我的问题的链接(是否有可能在Java静态中创建匿名内部类?):“因此静态上下文中的匿名类大致相当于静态嵌套类,因为它不保留对封闭的类,即使它在技术上不是静态类。“
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.