无法访问 Java 中的匿名 Class 方法

Unable to Access Anonymous Class Method in Java

每当我尝试从外部 class 调用属于匿名 class 的方法时,我都会收到编译器错误。示例:

public class Test {

    public static void main(String[] args) {
        Test testObj = new Test(){
            public void doStuff(){
                System.out.println("Test");
            }
        };
        testObj.doStuff();
    }
}

编译器提供的错误只是"Cannot find symbol - doStuff()"。我一定是忽略了什么……有什么想法吗?

提前致谢。

Java 是一种类型安全的语言。当你有一个 class Test 的对象(你声明 testObj 是)时,编译器只会让你调用 class [=10= 中定义的方法].即使你有一个 subclass 的实例,编译器也不会自动推断,所以它不会让你调用 subclass 方法。它只根据变量的类型。

您需要在 Test class 中定义 doStuff 方法。

当然,这使得匿名提交class它变得很愚蠢,除非你想覆盖该方法来做其他事情。

问题本质上归结为,引用变量和对象之间的区别是什么。 testObj 变量是 Test 类型,Test 没有 doStuff 方法,只有你的匿名 class 有,但是编译器可以创建匿名类型的 object,它不能' t 创建匿名类型的变量。底线是你不应该为这种类型的代码使用匿名类型,子 class 具有不在父 class 中的方法的代码。相反,要么给父 class 方法(这里给 Test doStuff 方法),要么考虑使用私有内部 class 代替你的匿名 class.

Test class 没有方法 doStuff()。当您创建匿名 class 时,您添加了一个名为 doStuff() 的新方法。然后将该引用存储为 Test 类型,这样就无法访问额外的方法。

你为什么要使用这样的匿名 class?

最简单的方法就是将doStuff()方法添加到test

public class Test {

     public void doStuff(){
          System.out.println("Test");
     }

    public static void main(String[] args) {
        Test testObj = new Test();
        testObj.doStuff();
    }
}

您只能从测试 class 的引用中调用现有方法。因此,如果您已经声明了 doStuff() 方法,那么您只能使用 Test testObj 引用来调用它。

看到这个 SO 问题 Is it possible to call subclasses' methods on a superclass object?

但是你肯定可以在匿名的其他方法声明中调用新方法 class。请参阅下面的示例。

示例:

public class Test {
    public void doStuff() {
        System.out.println("Test");
    }

    public static void main(String[] args) {
        Test testObj = new Test() {
            public void doStuff() {
                System.out.println("Inside anonymous class doStuff");
                doOtherStuff(); // calling new method doOtherStuff() and it works
            }

            public void doOtherStuff() {
                System.out.println("Inside anonymous class doOtherStuff");
            }
        };
        testObj.doStuff();

        /*Below code give compilation error: The method doOtherStuff() is undefined for the type Test*/
        // testObj.doOtherStuff();
    }
}

输出:

Inside anonymous class doStuff
Inside anonymous class doOtherStuff

问题是匿名 class 没有 类型名称 (这就是它被称为匿名的原因)。

您将匿名 class 实例分配给类型 Test 的变量,并且 Test 类型没有名为 doStuff.

的方法

因此您不能将匿名 class 实例分配给任何变量,然后在其上调用未在 superclass.

中定义的方法

可以调用该方法,如果您不分配它:

public class Test {

    public static void main(String[] args) {
        new Test(){
            public void doStuff(){
                System.out.println("Test");
            }
        }.doStuff();
    }
}

请注意,这在现实世界的 Java 程序中很少有用。

我只是展示这个来强调问题的根源:匿名 classes 当然可以拥有未在 superclass 中定义的方法,这是唯一的原因你不能轻易调用它们是因为 class 的类型是匿名的(没有名字)。但是它们仍然存在,可以直接在实例上调用。