在匿名类覆盖中引入新变量

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

【讨论】:

以上是关于在匿名类覆盖中引入新变量的主要内容,如果未能解决你的问题,请参考以下文章

如何动态创建新的匿名类?

有没有办法在其定义之外的匿名类中调用未覆盖或未实现的方法?

.net:在业务层引入匿名类型?

java 匿名对象,内部类,修饰符,代码块

java中,匿名内部类可以使用外部类的成员变量吗

Java学习(匿名对象内部类包import代码块)