以下示例我在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();
}
}
答案 0 :(得分:3)
接口可以匿名实现。这不是接口的实现,而是匿名子类中接口的实现。
接口本身不会被实例化。
有问题的一行是:
HelloWorld frenchGreeting = new HelloWorld() {
其中HelloWorld
是interface
。大括号已经表明这是一个匿名类。通过将其定义为HelloWorld
,您可以强制匿名类实现interface
中定义的方法。
如果您指的是在类中定义的接口本身:如果您希望仅为当前类定义接口而不将其暴露给其他对象,则可以在类中定义它。
如果您希望将其提供给外部世界,则必须声明您的班级和界面public
并使用MyClass.MyInterface
访问它。
答案 1 :(得分:1)
您可以使用与声明静态嵌套类和内部类相同的方式声明嵌套接口。嵌套的接口声明是隐式的static
(Java Language Specification §8.5.1) - “内部接口”没有意义,因为内部类的每个实例都包含对包含类的相关实例的引用,而你无法创建接口的实例(只有实现接口的类)。
在您的示例中,接口定义具有默认可见性(未声明public
,protected
或private
),因此与{{1}在同一个包中的任何类都是}可以将嵌套接口称为HelloWorldAnonymousClasses
。
答案 2 :(得分:0)
可能有一种情况,你需要在一个类中的多个实现(并且只有那个class
,你不想公开),所以Java提供了在课堂内声明Interface
的功能。
您可以参考here,类似的问题。
答案 3 :(得分:0)
如果您稍微阅读tutorial trail,它实际上可以回答您的问题。
匿名类定义是一个表达式,它必须是语句的一部分。匿名类表达式的语法类似于构造函数的调用,除了代码块中包含类定义之外。
示例中frenchGreeting
对象的实例化:
HelloWorld frenchGreeting = new HelloWorld() { /* other code */ };
匿名类表达式是实例化frenchGreeting
对象的语句的一部分,在结束括号后以分号结束。匿名类正在实现接口HelloWorld
。实现接口时,没有构造函数,因此您使用一对空括号,如本例所示。