12

这段代码是如何工作的,我完全感到困惑......

package com.servletpack.examples;

interface check {
    public void message();
}
public class Interface {
    public static void main(String[] args) {
        try {
            check t = new check() {//how????????????????
                public void message() {
                    System.out.println("Method defined in the interface");
                }
            };
            t.message();
        } catch (Exception ex) {
            System.out.println("" + ex.getMessage());
        }
    }
}
4

4 回答 4

24

使用该语法,您可以创建一个完全合法的匿名类。

在内部,匿名类被编译为它们自己的类,称为EnclosingClass$n封闭类的名称在$符号之前的位置。并n为每个额外的匿名类增加。这意味着正在创建以下类:

class Interface$1 implements check {
     public void message() {
         System.out.println("Method defined in the interface");
     }
}

然后,main编译中的代码在内部使用新定义的匿名类:

check t = new Interface$1();
t.message();
于 2013-06-02T06:58:28.180 回答
7

它是匿名类。您的检查类是一个接口。匿名类动态定义给定接口的实现。因此,它使您免于为接口的实现创建单独的类。仅当您知道在代码中的任何其他地方都不会需要此实现时,此方法才有用。

希望这个解释有帮助!

于 2013-06-02T07:25:14.180 回答
5

您正在创建一个实现接口检查的匿名类的实例(动态) 。

于 2013-06-02T06:57:16.537 回答
2

您的接口引用可以包含实现类的对象。您正在实现一个匿名类并将其分配给接口的引用,这在 JAVA 中是绝对合法的。

于 2013-06-02T06:58:29.903 回答