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

时间:2015-06-12 04:42:52

标签: java compiler-errors anonymous-class anonymous-inner-class

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

public class Test {

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

编译器提供的错误只是"找不到符号 - doStuff()"。我必须忽略一些事情......任何想法?

提前致谢。

5 个答案:

答案 0 :(得分:1)

Java是一种类型安全的语言。如果有一个类Test的对象(您声明为testObj),编译器将只允许您调用类Test中定义的方法。即使你有一个子类的实例,编译器也不会自动推断它,所以它不会让你调用子类方法。它只取决于变量的类型。

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

当然,除非你想覆盖该方法来做其他事情,否则这使得匿名子类化变得愚蠢。

答案 1 :(得分:1)

您只能从Test of Test类中调用现有方法。因此,如果您已声明doStuff()方法,那么只有您可以使用Test testObj引用来调用它。

请参阅此问题Is it possible to call subclasses' methods on a superclass object?

但是你肯定可以在匿名类的其他方法声明中调用new方法。见下面的例子。

示例:

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

答案 2 :(得分:1)

问题是匿名类没有类型名称(这就是为什么它被称为匿名)。

您已将匿名类实例分配给Test类型的变量,而Test类型没有名为doStuff的方法。

因此,您无法将匿名类实例分配给任何变量,然后在其上调用未在超类中定义的方法。

可以调用该方法,如果你没有分配它:

public class Test {

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

请注意,在实际的Java程序中,这种情况很少见。

我只是为了突出问题的根源而展示这一点:肯定允许匿名类具有未在超类中定义的方法,并且您不能轻易调用它们的唯一原因是因为类的类型是匿名的(没有名字)。但它们仍然存在,可以直接在实例上调用。

答案 3 :(得分:0)

问题归结为基本上,引用变量和对象之间的区别。 testObj变量是Test类型,Test没有doStuff方法,只有你的匿名类才有,但是当编译器可以创建匿名类型的对象时,它不能创建变量的匿名类型。最重要的是,您不应对此类代码使用匿名类型,代码中子类具有不在父类中的方法。相反,要么给父类提供方法(这里给测试doStuff方法),要么考虑使用私有内部类来代替你的匿名类。

答案 4 :(得分:0)

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

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

最简单的方法是只添加doStuff()方法进行测试

public class Test {

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

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