Java,匿名内部类定义

Java,匿名内部类定义,java,inheritance,overriding,anonymous-class,Java,Inheritance,Overriding,Anonymous Class,我在Java中看到了几个类似的例子,希望有人能解释发生了什么。似乎一个新类可以内联定义,这对我来说真的很奇怪 第一个打印输出行是预期的,因为它只是toString。然而,第二个函数似乎可以内联重写 有专门的术语吗? 或者任何更深入的文档 如果我有以下代码: public class Apple { public String toString() { return "original apple"; } } public class Driver { p

我在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

它是一个匿名的内部类。您可以在的Java文档链接中找到关于它的更多信息EDIT我添加了一个描述匿名内部类的函数,因为Java文档还有一些地方需要改进/EDIT

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

我有一个
按钮
,当我点击它时,我想让它在控制台上显示一些东西。但是我不想在另一个文件中创建一个新类,也不想在这个文件的后面定义一个内部类,我希望逻辑在这里立即可用

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);
    }
}

这个例子有点做作,显然不完整,但我认为它让人明白了这一点。

在你的代码中发生的事情是,你用一个匿名的内部类隐式地将
Apple
子类化,并重写它的
toString()
方法。

它被称为一个匿名的内部类,你可以读到关于它的信息,然后

我只想补充一点,onClick方法中的'this'值指的是Button实例,如果要指的是onClick方法中的示例实例,可以使用'Example.this'。但是静态内部类没有此引用。