[英]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
类的对象(你声明testObj
是testObj
)时,编译器只允许你调用在类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.