在匿名类覆盖中引入新变量
Posted
技术标签:
【中文标题】在匿名类覆盖中引入新变量【英文标题】:Introducing new variable in anonymous class override [closed] 【发布时间】:2021-10-31 09:12:44 【问题描述】:我在匿名类实现方面没有遇到任何特殊问题,但我在玩弄的时候注意到了一些让我觉得很有趣的东西。假设我有以下课程:
public class Foo
public void foo()
System.out.println("foo");
// foo
// Foo
在主类中,我有以下内容:
public class Main
public final Foo foo;
public static void main(String[] args)
foo = new Foo()
public String test = "test";
@Override
public void foo()
super.foo();
test = test + test;
System.out.println(test);
// foo
// anonymous override
// following line throws exception
// System.out.println(foo.test);
for (int i = 0; i < 3; i++)
foo.foo();
// for
// main
以下是打印到控制台的内容:
foo
test
foo
testtest
foo
testtesttesttest
无论我做什么,都无法从匿名覆盖之外访问String test
。即使我删除了“test = test + test”这一行并将 test 声明为 static 和 final,它仍然无法从匿名实现之外访问。
在这种情况下我没有特别需要使用变量,但是这让我很好奇我是否在这里遗漏了一些东西。只是,如果我需要将一个新变量嵌入到覆盖中,就像我在上面的示例中所做的那样。有没有什么方法可以在匿名覆盖之外访问变量“test”而不使用“父”类中的抽象方法或变量?
【问题讨论】:
我认为这里的班级是匿名的这一事实没有什么特别之处。你可以用外部的具体实现来做同样的事情 您的代码无法编译 我希望输出是 testtest、testtesttesttest、testtesttesttesttesttesttesttest,因为你在打印之前加倍。 【参考方案1】:Foo
类的匿名扩展有一个实例(foo
指向的实例)。因此,对一个实例的更改是累积的也就不足为奇了。
变量foo
是对Foo
的引用,而Foo
没有test
成员,因此没有可引用的内容。
您不能为具有test
成员的类编写强制转换,因为它没有您可以说出的名称。
你可以通过反思到达那里。
这一切似乎与类层次结构的预期完全一样。 匿名子类只是一个没有名字的子类,可以出现在源代码中。
如果您确实需要访问test
,则声明一个命名子类而不是匿名子类。 Suitable choice of access modifiers will allow you to declare foo
suitably, e.g.如果子类称为 FooBar,则为 FooBar foo
。
【讨论】:
以上是关于在匿名类覆盖中引入新变量的主要内容,如果未能解决你的问题,请参考以下文章