gpt4 book ai didi

java - 在接口(interface) : what is the outerclass? 中声明的匿名内部类

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:50:50 24 4
gpt4 key购买 nike

考虑以下几点:

public class OuterClass {

private String attribute = "outer";

class InnerClass {
private String attribute = "inner";
public doSomething() {
System.out.println(this.attribute);
System.out.println(OuterClass.this.attribute);

}
}

}

InnerClass 不是静态的,必须针对其外部类的实例创建。

new OuterClass().new InnerClass()

常规 innerclass 持有对创建它的外部类的引用,可以使用 Outer.this.myAttribute 访问(在这方面特别有用存在“命名冲突”的情况


创建匿名内部类时也是一样:创建的匿名内部类持有外部类的引用,这就是为什么在方法内部声明谓词时(匿名方法-局部内部类),我们仍然可以访问,内部类内部类,外部类的变量而不必将它们声明为 final(而我们应该将变量作为方法参数传递。

public class OuterClass {

// Do not need to be final because the innerclass keeps a reference to the outerclass
// even if it's an anonymous innerclass, it's still an innerclass
private String classAttribute = "classAttribute";

public Runnable doSomething() {

// Should be final because the variable lives on the stack and the reference to this object
// must be copied so that the String object is still accessible when the stack frame is destroyed
final String localVar = "localVar";

return new Runnable() {
@Override
public void run() {
System.out.println(classAttribute);
System.out.println(localVar);
}
};
}

}

最后,我们可以在接口(interface)中声明常量,这些常量隐式标记为 public static final。对象可以是常量。因此,作为匿名内部类创建的对象是接口(interface)的合法常量。

例如,在使用 Guava 时,我通常会在接口(interface)中声明函数和谓词,这样我就可以利用有用的 Guava 函数,例如 Maps.uniqueIndex(...)

public interface AlternativeNameable {

String getAlternativeName();

Function<AlternativeNameable,String> GET_ALTERNATIVE_NAME = new Function<AlternativeNameable,String>() {
@Override
public String apply(AlternativeNameable input) {
return input.getAlternativeName();
}
};

}

所以你可能会问自己我的问题是什么?在这里:

当将匿名类声明为接口(interface)常量时(参见我的最后一个代码示例),匿名内部类对哪个外部类持有引用?

最佳答案

接口(interface)中定义的字段 always implicitly have the modifiers public static final .它是一个常数,因此它没有关联的外部类。

此外,member types of interfaces are implicitly public and static ,这也适用于匿名类。

关于java - 在接口(interface) : what is the outerclass? 中声明的匿名内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13306319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com