每当我尝试从外部类调用属于匿名类的方法时,我都会收到编译器错误。例如:
public class Test {
public static void main(String[] args) {
Test testObj = new Test(){
public void doStuff(){
System.out.println("Test");
}
};
testObj.doStuff();
}
}
编译器提供的错误只是"找不到符号 - doStuff()"。我必须忽略一些事情......任何想法?
提前致谢。
答案 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();
}
}