gpt4 book ai didi

java - 如何将成员变量与接口(interface)和匿名实现一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:40:18 26 4
gpt4 key购买 nike

请检查下面的Java代码:

public class Test
{
public static void main(String arg[]) throws Throwable
{
Test t = new Test();
System.out.println(t.meth().s); //OP: Old value
System.out.println(t.meth().getVal()); //OP: String Implementation
}
private TestInter meth()
{
return new TestInter()
{
public String s = "String Implementation";
public String getVal()
{
return this.s;
}
};
}
}
interface TestInter
{
String s = "Old value";
String getVal();
}

如您所见,我已经匿名创建了一个界面。当我直接访问接口(interface)变量时,它会显示“旧值”。

t.meth().s => "旧值"

通过 getVal() 方法访问它返回正确的值,

t.meth().getVal() => “字符串实现”

我不明白这段代码是如何工作的,有人能给我解释一下吗?

最佳答案

在接口(interface)中声明的 s 变量与您在匿名内部类中声明的 s 变量完全分开

接口(interface)变量实际上只是设计为常量——它们不是每个实现需要提供的 API 的一部分。特别是,它们是隐式静态和最终的。

来自JLS section 9.3 :

Every field declaration in the body of an interface is implicitly public, static, and final. It is permitted to redundantly specify any or all of these modifiers for such fields.

您通过实现实例访问该字段的事实无关紧要 - 此代码:

System.out.println(t.meth().s);

是有效的:

t.meth();
System.out.println(TestInter.s);

我强烈建议您避免在接口(interface)中使用变量除了真正的常量……即使那样,也只有在真正有意义的地方。目前尚不清楚您要实现的目标,但在 IMO 中声明一个字段并不是一个好的方法。

关于java - 如何将成员变量与接口(interface)和匿名实现一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16954755/

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