匿名类声明中的语句

时间:2015-12-17 11:49:00

标签: java anonymous-class

我正在浏览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();
    }            
}

本教程继续解释: 匿名类表达式包含以下内容:

  1. 新运营商

  2. 要实现的接口的名称或要扩展的类。在此示例中,匿名类正在实现接口HelloWorld。

  3. 包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:实现接口时,没有构造函数,因此您使用一对空括号,如本例所示。

  4. 一个正文,它是一个类声明体。 更具体地说,在正文中,允许使用方法声明,但声明不允许。

  5. 我对这一点感到困惑。 4以上。它说匿名类声明体中不允许声明,但我可以看到它内部使用的语句。 (我已经发表评论Statement1和Statement2来强调它们。)

    请您解释一下教程想从第一点开始传达的内容。 4?

    提前致谢。

3 个答案:

答案 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)

你在statementfield 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年,但只是以不同的方式来理解它。匿名类的主体就像任何其他顶级类主体一样。

我们只能在类中拥有成员,即变量(有或没有初始化)以及方法和初始化块。

任何语句只能在方法或初始化块中发生,但不能单独发生。