【问题标题】:Anonymous classes having interface keyword inside a class declaration在类声明中具有接口关键字的匿名类
【发布时间】:2013-11-25 13:07:20
【问题描述】:

我在 oracle 文档中看到的匿名类示例的以下示例。但是他们如何在类 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();
    }            
}

【问题讨论】:

  • 为什么你认为这应该是一个问题?接口只是类的一个成员。跟匿名类没关系?
  • @RohitJain:他可能指的是这一行HelloWorld frenchGreeting = new HelloWorld()
  • @JeroenVannevel 我不认为他是那个意思。我重新阅读了这个问题,但我没有发现它会导致那个问题。显然是在问 - 他们如何编写接口 HelloWorld insideHelloWorldAnonymousClasses
  • @RohitJain:嗯,我倾向于同意你的观点。无论哪种方式,我都会在我的回复中澄清它(我认为匿名接口实现在这里会引起混淆,而不是那样)。

标签: java


【解决方案1】:

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

接口本身不会被实例化。

有问题的行是这样的:

HelloWorld frenchGreeting = new HelloWorld() {

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

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

如果你想让它也对外部世界可用,你必须声明你的类和接口 public 并使用 MyClass.MyInterface 访问它。

【讨论】:

  • 是Java8的特性吗?
  • 为了进一步解释,任何想要实现 HelloWorld 的人都会这样做: public class ExampleHelloWorld implements HelloWorldAnonymousClasses.HelloWorld { //方法和属性在这里 }
  • @GoranŠtuc:不,他不是这个意思。我会在回复中澄清这一点。
  • @JeroenVannevel:实际上在这种情况下并非如此,因为声明的任何接口都是公共的,任何外部的人都可以使用此接口,在这种情况下,唯一的解决方案可能是重构主类以将可见性打包为阻止这个包之外的其他类使用它
  • @Batty 它甚至可以在 Java 5 中编译。
【解决方案2】:

您可以像声明静态嵌套类和内部类一样声明嵌套接口。嵌套接口声明隐含 static (Java Language Specification §8.5.1) - “内部接口”没有意义,因为内部类的每个实例都包含对包含类的相关实例的引用,并且您无法创建接口的实例(仅限实现该接口的类)。

在您的示例中,接口定义具有默认可见性(未声明 publicprotectedprivate),因此与 HelloWorldAnonymousClasses 位于同一包中的任何类都可以将嵌套接口引用为HelloWorldAnonymousClasses.HelloWorld.

【讨论】:

    【解决方案3】:

    可能存在这样一种情况,您需要在一个类中多个实现接口(并且只针对那个class,您不想公开),因此Java提供了在类内声明Interface

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

    【讨论】:

      【解决方案4】:

      如果你把tutorial trail读得更远一点,它实际上可以回答你的问题。

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

      您的示例中frenchGreeting 对象的实例化:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多