Java - 内联类定义

时间:2012-01-18 16:11:10

标签: java inheritance override

我在Java中看到过几个类似的例子,我希望有人可以解释发生了什么。看起来像一个新类可以内联定义,这对我来说似乎很奇怪。第一个打印输出行是预期的,因为它只是toString。然而第二个看起来像函数可以重写内联。这有技术术语吗?或者任何更深入的文档?谢谢!

如果我有以下代码:

public class Apple {
    public String toString() {
        return "original apple";
    }
}

public class Driver {
    public static void main(String[] args) {
        System.out.println("first: " + new Apple());
        System.out.println("second: " + 
            new Apple() {
                public String toString() {
                    return "modified apple";
                }
            }
        );
    }
}

代码输出:

first: original apple
second: modified apple

3 个答案:

答案 0 :(得分:15)

这是一个匿名的内部类。您可以在Inner Classes的Java文档链接中找到有关它的更多信息。 编辑 我正在添加一个描述匿名内部类的better link,因为Java文档会留下一些需要的东西。的 / EDIT

大多数人会使用匿名内部类来动态定义侦听器。请考虑以下情况:

我有一个Button,当我点击它时,我想让它向控制台显示一些东西。但我不想在不同的文件中创建一个新类,我不想在此文件中稍后定义内部类,我希望逻辑立即可用。

class Example {
    Button button = new SomeButton();

    public void example() {
        button.setOnClickListener(new OnClickListener() {
            public void onClick(SomeClickEvent clickEvent) {
                System.out.println("A click happened at " + clickEvent.getClickTime());
            }
        });
    }

    interface OnClickListener {
        void onClick(SomeClickEvent clickEvent);
    }

    interface Button {
        void setOnClickListener(OnClickListener ocl);
    }
}

这个例子有点做作,显然不完整,但我认为它可以解决这个问题。

答案 1 :(得分:2)

您的代码中发生的事情是您隐式将Apple与一个匿名内部类子类化并覆盖其toString()方法。

答案 2 :(得分:0)

被称为匿名内部类,您可以阅读herehere