如果我有以下课程:
public class TestObject {
public String Hooray() {
return "Hooray!";
}
}
我显然可以实例化该对象,并且我知道某种子类化必须继续,因为我可以覆盖Hooray方法,但是如果有子类化,为什么我不能在匿名类中创建一个新方法?
TestObject a = new TestObject() {
public String Boo() {
return "Booooo";
}
};
System.out.println(a.Boo());
返回语法错误
答案 0 :(得分:5)
您可以创建方法,Boo
方法没有任何问题(除了前面有大写字母的事实)。问题是在匿名类之外,Boo方法不可用(它不作为类的API的一部分公开)。
这与实现接口的任何类相同...如果类具有不属于接口的方法(甚至公共方法),则需要将实例强制转换为特定类以访问这些方法
不幸的是,因为这是一个匿名类,你不能强制转换它(你不知道要把它转换成什么)。
这些内部方法仍然有用,但您必须从匿名类内部调用它们,而不是从外部调用它们。
答案 1 :(得分:1)
因为类没有名称,所以在编译时不能引用它的类型定义。编译器只能将它知道为TestObject,它没有boo()方法
答案 2 :(得分:1)
你有这个:
public class TestObject {
public String Hooray() {
return "Hooray!";
}
}
TestObject a = new TestObject() {
public String Boo() {
return "Booooo";
}
}
System.out.println(a.Boo());
你不能这样做。你可以在匿名内部类中创建新方法,事实上,你是。但是您无法从外部拨打a.Boo()
,因为a
是TestObject
而TestObject
没有名为Boo
的方法。这是你不能这样做的原因:
public class Base {
public void something ();
}
public class Derived extends Base {
public void another ();
}
Base b = new Derived();
b.another(); // b is a Base, it must be cast to a Derived to call another().
在上面你必须将b
强制转换为Derived
来调用添加到派生类的新方法:
((Derived)b).another();
您无法使用匿名内部类(这只是用于派生新子类的语法快捷方式)的原因正是因为它们是匿名的 - 没有可用于将它们转换为的类型。
顺便说一下,当你想到它时,你无法通过类型another()
访问Base
的原因非常简单。虽然Derived
是Base
,但编译器无法知道Base b
持有Derived
而不是{em>的其他子类Base
{1}} 没有拥有another()
方法。
希望有所帮助。