如何初始化匿名类的对象?

gxwragnw  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(300)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。

5年前关门了。
改进这个问题
我们不能在匿名类中声明构造函数。但是如果我需要初始化一个匿名类的对象的状态,比如说,局部变量,我该怎么做呢?

cld4siwp

cld4siwp1#

您可以执行以下操作:

final int localVar = 5;

new Runnable() {
    int innerVar = localVar;  // <--- initialized here

    public void run() {
        System.out.println(innerVar);
    }
}.run();

如果 localVar 是变异的(不是最终的),您可以使用

...
final int tmp = localVar;
new Runnable() {
    int innerVar = tmp;
    ...
...

另请注意,如果需要调用方法或执行通常在构造函数中执行的其他初始化操作,则可以使用示例初始值设定项:

final int localVar = 5;

new Runnable() {
    int innerVar;

    // Initialization block executed upon construction of this class
    {
        System.out.println("Initializing an anonymous Runnable");
        innerVar = localVar;
    }

    public void run() {
        System.out.println(innerVar);
    }
}.run();

请参阅示例:为什么使用java示例初始值设定项?

ig9co6j1

ig9co6j12#

您认为我们不能使用构造函数来创建匿名类的假设是不完全正确的。只有从接口(不能有构造函数)创建匿名类时,才会出现这种情况。请看下面的示例:

public class Main {

    public static class Razzy {
        private final String name;

        public Razzy(final String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

    public static void main(final String[] args) {
        final Razzy anonymous = new Razzy("Award") {
            @Override
            public String getName() {
                return "Anonymous " + super.getName();
            }
        };
        System.out.println(anonymous.getName());
    }
}

在这里,类razzy有一个接受字符串的构造函数。在main方法中,使用这个单参数构造函数创建了razzy的匿名子类。
输出为:
匿名奖
这样就可以将局部变量传递到匿名类的构造函数中。
请注意,匿名类还可以访问其封闭类的字段:

public class Main {

    private static String input = "Award";

    public interface Razzy {           
        public String getName();
    }

    public static void main(final String[] args) {
        final Razzy anonymous = new Razzy() {
            @Override
            public String getName() {
                return "Anonymous " + input ;
            }
        };
        System.out.println(anonymous.getName());
    }
}

具有相同的输出。

yrefmtwq

yrefmtwq3#

问题是,实际上不需要定义构造函数。匿名类隐式地可以访问封闭方法范围内的任何变量。它们只需要声明为final(在java8中,final关键字是不需要的,但是您仍然不能为它们重新赋值)。

public void enclosingMethod() {
    final int localVariable = 42; // final is necessary

    Runnable r = new Runnable() {
        public void run() {
            // look ma, no constructors!
            System.out.println(localVariable);
        }
    };
    r.run(); // prints 42
}

相关问题