Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Statements in anonymous class declaration

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:

  1. The new operator

  2. The name of an interface to implement or a class to extend. In this example, the anonymous class is implementing the interface HelloWorld.

  3. 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.

  4. 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.

like image 244
pratz Avatar asked Dec 17 '15 11:12

pratz


People also ask

Can an anonymous class be declared as?

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.

How do you declare an anonymous class in Java?

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.

What's meant by anonymous class explain with example?

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.

Which of the following is true for anonymous 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.


2 Answers

Statements are not allowed means that any of the following are not allowed.

  • Assignment expressions (aValue = 8933.234;)
  • Any use of ++ or -- (aValue++;)
  • Method invocations (System.out.println("Hello World!");)
  • Object creation expressions (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.

like image 84
tharindu_DG Avatar answered Oct 17 '22 00:10

tharindu_DG


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.

like image 37
Mayank Madhav Avatar answered Oct 16 '22 23:10

Mayank Madhav