在类声明中具有interface关键字的匿名类

时间:2013-11-25 13:07:20

标签: java

以下示例我在oracle doc中看到了匿名类的例子。但是他们如何在类HelloWorldAnonymousClasses中编写接口HelloWorld

public class HelloWorldAnonymousClasses {

      interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }

    public void sayHello() {

        class EnglishGreeting implements HelloWorld {
            String name = "world";
            public void greet() {
                greetSomeone("world");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }

        HelloWorld englishGreeting = new EnglishGreeting();

        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };

        HelloWorld spanishGreeting = new HelloWorld() {
            String name = "mundo";
            public void greet() {
                greetSomeone("mundo");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hola, " + name);
            }
        };
        englishGreeting.greet();
        frenchGreeting.greetSomeone("Fred");
        spanishGreeting.greet();
    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp =
            new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }            
}

4 个答案:

答案 0 :(得分:3)

接口可以匿名实现。这不是接口的实现,而是匿名子类中接口的实现。

接口本身不会被实例化。

有问题的一行是:

HelloWorld frenchGreeting = new HelloWorld() {

其中HelloWorldinterface。大括号已经表明这是一个匿名类。通过将其定义为HelloWorld,您可以强制匿名类实现interface中定义的方法。

如果您指的是在类中定义的接口本身:如果您希望仅为当前类定义接口而不将其暴露给其他对象,则可以在类中定义它。

如果您希望将其提供给外部世界,则必须声明您的班级和界面public并使用MyClass.MyInterface访问它。

答案 1 :(得分:1)

您可以使用与声明静态嵌套类和内部类相同的方式声明嵌套接口。嵌套的接口声明是隐式的staticJava Language Specification §8.5.1) - “内部接口”没有意义,因为内部类的每个实例都包含对包含类的相关实例的引用,而你无法创建接口的实例(只有实现接口的类)。

在您的示例中,接口定义具有默认可见性(未声明publicprotectedprivate),因此与{{1}在同一个包中的任何类都是}可以将嵌套接口称为HelloWorldAnonymousClasses

答案 2 :(得分:0)

可能有一种情况,你需要在一个类中的多个实现(并且只有那个class,你不想公开),所以Java提供了在课堂内声明Interface的功能。

您可以参考here,类似的问题。

答案 3 :(得分:0)

如果您稍微阅读tutorial trail,它实际上可以回答您的问题。

匿名类定义是一个表达式,它必须是语句的一部分。匿名类表达式的语法类似于构造函数的调用,除了代码块中包含类定义之外。

示例中frenchGreeting对象的实例化:

HelloWorld frenchGreeting = new HelloWorld() { /* other code */ };

匿名类表达式是实例化frenchGreeting对象的语句的一部分,在结束括号后以分号结束。匿名类正在实现接口HelloWorld。实现接口时,没有构造函数,因此您使用一对空括号,如本例所示。