I was going through anonymous class tutorial from oracle documentation (https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)
I've copied the code used in the tutorial.(Comments Statement1 and Statement2 are appended by me):
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();
}
}
The tutorial goes on to explain: The anonymous class expression consists of the following:
The new operator
The name of an interface to implement or a class to extend. In this example, the anonymous class is implementing the interface HelloWorld.
Parentheses that contain the arguments to a constructor, just like a normal class instance creation expression. Note: When you implement an interface, there is no constructor, so you use an empty pair of parentheses, as in this example.
A body, which is a class declaration body. More specifically, in the body, method declarations are allowed but statements are not.
I got confused by the point no. 4 above. It says that statements are not allowed in the anonymous class declaration body but I can see statements used inside it. (I've put comments Statement1 and Statement2 to highlight them).
Could you please explain what the tutorial wants to convey from point no. 4?
Thanks in advance.
Anonymous classes also have the same restrictions as local classes with respect to their members: You cannot declare static initializers or member interfaces in an anonymous class.
Object = new Example() { public void display() { System. out. println("Anonymous class overrides the method display()."); } }; Here, an object of the anonymous class is created dynamically when we need to override the display() method.
It is an inner class without a name and for which only a single object is created. An anonymous inner class can be useful when making an instance of an object with certain “extras” such as overriding methods of a class or interface, without having to actually subclass a class.
18) Which of the following is true about the anonymous inner class? Explanation: Anonymous inner classes are the same as the local classes except that they don't have any name. The main use of it is to override methods of classes or interfaces.
Statements are not allowed means that any of the following are not allowed.
aValue = 8933.234;
)aValue++;
)System.out.println("Hello World!");
)Bicycle myBike = new Bicycle();
)But this documentation also says that,
Note that you can declare the following in anonymous classes:
- Fields
- Extra methods (even if they do not implement any methods of the supertype)
- Instance initializers
- Local classes
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);
}
};
Hope this helps.
Its like 3 years late, but just to put it in a different way to understand. Anonymous class's body is like any other top level class body.
We can only have members in the class, i.e. variables ( with or without initialization) and methods and initialization blocks.
Any statements can occur only inside a method, or initialization blocks, but not by itself.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With