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

时间:2014-04-19 20:51:40

标签: java

我曾经像这样创建类的实例;

Classname a=new Classname();

OR

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

但是下面的编码很混乱。
为什么它们用括号括起来并包括方法。
我们在结尾处加分号?

LocationResult locationResult = new LocationResult(){
    @Override
    public void gotLocation(Location location){

    }
};

2 个答案:

答案 0 :(得分:3)

那是anonymous class。它是类定义和类实例化的组合:它允许您定义一个类(扩展另一个类或接口)而不给它一个名称并在同一个地方实例化它。当您只在代码中的一个位置使用此特定类时,此功能非常有用:您不会真正想要为其命名,因为您不会在其他地方使用它。例如,将click事件侦听器绑定到特定的GUI按钮时,您可能不会对任何其他按钮使用相同的单击事件侦听器类。

最后,这只是语法糖。您可以通过在其他地方定义命名类并像往常一样实例化来实现相同的功能。匿名类可以通过在您使用它的同一个地方放置一个类的定义来帮助您使代码更简洁。

至于语法:将其视为常规类实例化,但在其间添加类定义。你从:

开始
LocationResult locationResult = new LocationResult();

(当然这可能不会起作用,因为LocationResult很可能是一个接口或一个抽象类,因此你不能像那样实例化它。)

然后,您只需在);

之间添加类定义
LocationResult locationResult = new LocationResult(){
    @Override
    public void gotLocation(Location location){

    }
};

答案 1 :(得分:2)

这是一个匿名覆盖。当您想要创建特定于某个组件的匿名动作侦听器时,通常会使用它。您可以创建仅使用一次的匿名类,而不是创建一个可以被多个组件引用的单独类。

Java tutorials on anonymous classes:"匿名类可以让您的代码更简洁。它们使您能够同时声明和实例化一个类。他们就像当地的班级,除了他们没有名字。如果您只需要使用本地课程一次,请使用它们。"

例如,下面创建了一个专门用于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
    }
});