我正在浏览oracle文档(https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)
中的匿名类教程我已经复制了本教程中使用的代码。(注释Statement1和Statement2附加在我身上):
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"; //Statement1
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"; //Statement2
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();
}
}
本教程继续解释: 匿名类表达式包含以下内容:
新运营商
要实现的接口的名称或要扩展的类。在此示例中,匿名类正在实现接口HelloWorld。
包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:实现接口时,没有构造函数,因此您使用一对空括号,如本例所示。
一个正文,它是一个类声明体。 更具体地说,在正文中,允许使用方法声明,但声明不允许。
我对这一点感到困惑。 4以上。它说匿名类声明体中不允许声明,但我可以看到它内部使用的语句。 (我已经发表评论Statement1和Statement2来强调它们。)
请您解释一下教程想从第一点开始传达的内容。 4?
提前致谢。
答案 0 :(得分:5)
Statements表示不允许以下任何行为。
aValue = 8933.234;
)aValue++;
)System.out.println("Hello World!");
)Bicycle myBike = new Bicycle();
)但this文档也说明了
请注意,您可以在匿名类中声明以下内容:
- 字段
- 额外的方法(即使它们没有实现任何超类型的方法)
- Instance initializers
- 本地课程
HelloWorld spanishGreeting = new HelloWorld() {
String name = "mundo"; //Statement2
double aValue = 0.0;
String s = "Hi"; //instance variable initializers are allowed
// assignment statement
aValue = 8933.234; // not allowed
// increment statement
aValue++; // not allowed
// method invocation statement
System.out.println("Hello World!"); // not allowed
// object creation statement
Bicycle myBike = new Bicycle(); //instance variable initializers are allowed
public void greet() {
greetSomeone("mundo");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hola, " + name);
}
};
希望这有帮助。
答案 1 :(得分:3)
你在statement
和field declaration
之间感到困惑。正如@sidgate在评论中所提到的,它不是一个语句,而是实例定义和初始化。
更清楚地理解它 试着写一些像
这样的陈述HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde"; //Statement1
System.out.print("this is a statement");// it wont compile
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
答案 2 :(得分:0)
它好像已经晚了3年,但只是以不同的方式来理解它。匿名类的主体就像任何其他顶级类主体一样。
我们只能在类中拥有成员,即变量(有或没有初始化)以及方法和初始化块。
任何语句只能在方法或初始化块中发生,但不能单独发生。