10

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.

pratz
  • 107
  • 7

3 Answers3

7

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.

tharindu_DG
  • 8,900
  • 6
  • 52
  • 64
4

You got confused between statement and field declaration.As mentioned in comment by @sidgate, its not a statement but instance definition and initialization.

To understand it more clearly try to put some statements like

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);
            }
        };
RockAndRoll
  • 2,247
  • 2
  • 16
  • 35
  • 1
    So does this "statement in anonymous class' body prohibition" simply mean you can't put statements outside of a method or initialization block? This is applied to any Java class, so why mention explicitly for anonymous ones? – miracle_the_V Dec 17 '15 at 12:29
  • 1
    @miraclefoxx You're right, it applies to any class and it's a bit confusing that they highlight it just for anonymous classes. I would *guess* they do that because an anyonymous class can look a bit like a code-block, and so you might expect to be able to put a statement in. – matt freake Dec 17 '15 at 14:11
4

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.

Mayank Madhav
  • 429
  • 1
  • 7
  • 19