java - 为什么 Java 在内部将匿名类创建为静态的?

标签 java class oop anonymous-class anonymous-inner-class

abstract class Person {  
abstract void eat();  
}  

class TestAnonymousInner {  
  public static void main(String args[]){  
  Person p=new Person() {  
    void eat(){System.out.println("nice fruits");}  
    };  
  p.eat();  
  }  
}

编译器生成的内部类

static class TestAnonymousInner$1 extends Person
{
    TestAnonymousInner$1(){}
    void eat()
    {
        System.out.println("nice fruits");
    }
}

编译器出于什么原因将匿名类创建为静态类?如果它是非静态的会发生什么?

最佳答案

所示代码在静态上下文中创建了一个匿名类。内部类(或非静态嵌套类)需要引用封闭对象 (*)。在这种情况下,没有封闭对象,因为它是在静态方法中创建的,因此使用静态嵌套类是唯一有效的选择。

这可以很容易地通过将您的示例转换为

来证明
public class TestInner {
    public static void main(String args[]){
        Person p = new Testperson();
        p.eat();
    }

    public class Testperson extends Person {
        void eat() {
            System.out.println("nice fruits");
        }
    }
}

编译会报错

non-static variable this cannot be referenced from a static context

如果你把它改成:

public class TestInner {
    public static void main(String args[]){
        Person p = new Testperson();
        p.eat();
    }

    public static class Testperson extends Person {
        void eat() {
            System.out.println("nice fruits");
        }
    }
}

*:编译器将修改内部类的构造函数以接受封闭对象作为参数,并且构造函数调用将被重写以传递 this 作为该参数的值。静态嵌套类不是这种情况。

关于java - 为什么 Java 在内部将匿名类创建为静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50273342/

相关文章:

oop - 如何获取 MATLAB 句柄对象的 ID?

java - JVM到底是如何编译三元运算符的?我应该关注不同的 api 版本吗?

java - Node JS 服务器处理 10000 个 websockets

java - 从另一个方法传递变量值

javascript - 对象未通过引用传递(CoffeeScript)

java - super() 在构造函数中是什么意思?

java - 文件名未从不同类添加到 ArrayList

c++ - 部分类模板特化是这个设计问题的答案吗?

java - CLI : getOptionValue always return 'null'

java - OOP:有没有简单的接口(interface)提取和不那么冗长的自动转发的习惯用法?