Java 匿名类声明中的语句

Java 匿名类声明中的语句,java,anonymous-class,Java,Anonymous Class,我正在阅读oracle文档()中的匿名课堂教程 我已经复制了教程中使用的代码。(注释语句1和语句2由我附加): 本教程将继续解释: 匿名类表达式由以下内容组成: 新接线员 要实现的接口或要扩展的类的名称。在本例中,匿名类正在实现接口HelloWorld 包含构造函数参数的括号,就像普通的类实例创建表达式一样。注意:当您实现一个接口时,没有构造函数,所以您使用一对空括号,如本例所示 一个主体,它是一个类声明主体更具体地说,在主体中,允许方法声明,但不允许语句。 我被上面第四点弄糊涂了。它说匿名类声

我正在阅读oracle文档()中的匿名课堂教程

我已经复制了教程中使用的代码。(注释语句1和语句2由我附加):

本教程将继续解释: 匿名类表达式由以下内容组成:

  • 新接线员

  • 要实现的接口或要扩展的类的名称。在本例中,匿名类正在实现接口HelloWorld

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

  • 一个主体,它是一个类声明主体更具体地说,在主体中,允许方法声明,但不允许语句。

  • 我被上面第四点弄糊涂了。它说匿名类声明体中不允许使用语句,但我可以看到其中使用的语句。 (我将注释放在语句1和语句2中以突出显示它们)

    你能解释一下教程想从第4点传达什么吗


    提前感谢。

    您混淆了
    语句
    字段声明
    。正如@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);
                }
            };
    
    不允许表示以下任何一项都不允许

    • 赋值表达式(
      aValue=8933.234;
    • 使用++或--(
      aValue++;
    • 方法调用(
      System.out.println(“Hello World!”);
    • 对象创建表达式(
      Bicycle myBike=new Bicycle();
    但文档中也指出,

    请注意,您可以在匿名类中声明以下内容:

    • 田地
    • 额外方法(即使它们不实现任何超类型的方法)
    • 本地班

    希望这能有所帮助。

    这好像晚了3年,但只是用另一种方式来理解。匿名类的主体类似于任何其他顶级类主体

    我们只能在类中有成员,即变量(带或不带初始化)、方法和初始化块


    任何语句只能出现在方法或初始化块内部,但不能单独出现。

    它不是一个语句,而是实例变量定义和初始化。这些都是字段声明,也应该是
    私有的
    ,这有助于消除您的混淆。这一“匿名类中的语句”正文禁止也是如此就是说不能将语句放在方法或初始化块之外?这适用于任何Java类,那么为什么要明确提到匿名类呢?@miraclefoxx你是对的,它适用于任何类,它们只针对匿名类突出显示它有点令人困惑。我猜他们这样做是因为anyonymous类看起来有点像代码块,因此您可能希望能够在中放入语句。不允许:对象创建表达式(Bicycle myBike=new Bicycle();),但您已经创建了一个带有//allowed comment的String对象。福克斯:我在更新答案。很抱歉耽搁了。我觉得这仍然是个矛盾。请稍等片刻explanation@miraclefoxx:这可能会有帮助@塔林杜:谢谢你的解释。据我所知,这适用于任何类声明,无论是普通声明还是匿名声明。我说得对吗?
    
    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);
                }
            };
    
        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);
            }
        };