是否可以通过任何方式访问anonySubClassMethod方法? 如果没有为什么Java编译器允许创建此方法?
abstract interface AnonyIfc {
public abstract void methodIfc ();
}
public class AnonyImplementation {
public static void main (String... a) {
AnonyIfc obj = new AnonyIfc(){
public void methodIfc() {
System.out.println("methodIfc");
}
public void anonySubClassMethod() {
System.out.println("anonySubClassMethod");
}
};
//obj.anonySubClassMethod() won't be visible since refering sub class
// method with super class reference
}
}
更新
来自Francis Upton我明白anonySubClassMethod可以在匿名类中使用。那么我可以期望java编译器将访问说明符限制为anonySubClassMethod的私有吗?希望这个公共说明人也有理由。只是好奇。
答案 0 :(得分:9)
正如其他人所说,可以从类中调用该方法。从课外调用它的唯一方法(除了使用反射)将如下所示:
new Object() {
void doSomething() {
//code
}
}.doSomething();
答案 1 :(得分:5)
您可以使用反射来访问它,但是否则无法从匿名类之外的任何代码中获取它。但这并不意味着您无法从在类中访问它。 methodIfc()
可以调用它,这就是为什么编译器不能轻易地将它声明为死代码。
答案 2 :(得分:2)
可以从匿名类中调用该方法。此构造的更典型用法是您正在实现接口(例如,对于GUI侦听器)的情况,因此该方法将是已知的,因为它是调用者期望的接口的实现。
答案 3 :(得分:2)
编译器不限制anonySubClassMethod
对private的可见性的原因是可以通过反射访问此方法:
obj.getClass().getMethod("anonySubClassMethod").invoke(obj)
如果您不想使用反射,则无法调用此方法。