这个类的实例化是如何工作的?

3

以前我创建类的实例是这样的;

Classname a=new Classname();

OR

Classname a=new Classname(1,2,3);

但以下代码非常令人困惑。
为什么要用括号将其括起来,并包含在方法内部?
为什么要在结尾处加上分号?
LocationResult locationResult = new LocationResult(){
    @Override
    public void gotLocation(Location location){

    }
};
2个回答

3

这是一个匿名类。它是类定义和类实例化的组合:让你在同一位置定义一个类(扩展另一个类或接口)而不给它一个名称,并实例化它。当您只在代码中的一个位置使用这个特定的类时,这是很有用的:您不需要给它一个名称,因为您不会在任何其他地方使用它。例如,当将单击事件侦听器绑定到特定的GUI按钮时,您可能不会将相同的单击事件侦听器类用于任何其他按钮。

最后,这都只是语法糖。您可以通过在其他地方定义一个命名类并像通常一样实例化它来达到相同的效果。匿名类可以通过在使用它的同一位置放置只使用一次的类的定义来使您的代码更加简洁。

至于语法:把它看作普通类实例化,但在中间添加了类定义。您从以下内容开始:

LocationResult locationResult = new LocationResult();

当然,这种方法可能行不通,因为LocationResult很可能是一个接口或抽象类,因此你不能像那样实例化它。
然后,你只需在);之间添加类定义。
LocationResult locationResult = new LocationResult(){
    @Override
    public void gotLocation(Location location){

    }
};

2
这是一个匿名覆盖。通常在您想要创建特定于某个组件的匿名动作监听器时使用。您可以创建一个只使用一次的匿名类,而不是创建一个可以被多个组件引用的单独的类。
Java教程上的匿名类中可以了解到:"匿名类使您的代码更简洁。它们使您能够同时声明和实例化一个类。它们就像本地类一样,但它们没有名称。如果您只需要使用本地类一次,请使用它们。"
例如,下面的代码为JButton创建了一个特定的匿名ActionListener类。
JButton button = new JButton();

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        //do something specific to this button
        //this is an anonymous ActionListener class
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接