繁体   English   中英

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

[英]Unable to Access Anonymous Class Method in Java

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

public class Test {

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

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

提前致谢。

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

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

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

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

看到这个问题是否可以在超类对象上调用子类的方法?

但是你肯定可以在匿名类的其他方法声明中调用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

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

你分配你的匿名类实例类型的变量Test ,而Test类型没有命名的方法doStuff

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

可能的,虽然调用该方法,如果你不给它分配:

public class Test {

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

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

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

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

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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM