Java 匿名类方法访问

Java 匿名类方法访问,java,Java,有没有可能访问anonySubClassMethod方法? 如果没有,为什么Java编译器允许创建此方法 abstract interface AnonyIfc { public abstract void methodIfc (); } public class AnonyImplementation { public static void main (String... a) { AnonyIfc obj = new AnonyIfc(){ pu

有没有可能访问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的访问说明符限制为private吗?希望这个公共说明符也会有原因。只是好奇。

可以从匿名类中调用该方法。这种构造更典型的用途是实现一个接口(例如GUI侦听器),因此该方法是已知的,因为它是调用方所期望的接口的实现。

您可以使用反射来访问它,但除此之外,从匿名类之外的任何代码都无法访问它。但这并不意味着你不能从类内访问它
methodIfc()
可以调用它,这就是为什么编译器不能轻松地将其声明为死代码。

正如其他人所指出的,可以从类内调用该方法。从类外调用它的唯一方法(除了使用反射)如下所示:

new Object() {
    void doSomething() {
        //code
    }
}.doSomething();

编译器没有将
anonySubClassMethod
的可见性限制为private的原因是可以通过反射来访问此方法:
obj.getClass().getMethod(“anonySubClassMethod”).invoke(obj)


如果不想使用反射,则无法调用此方法。

谢谢。那么,我能指望编译器限制anonySubClassMethod的访问修饰符仅为private吗?不,在对象实现所用接口的情况下,该方法将被要求为public。这是我在回答中提到的常见情况。您不能调用该方法,因为它未在类中定义,这与它的可见性无关,因为调用者不知道它。如果您查看生成的代码,它实际上创建了另一个带有$n后缀的类。接口本身和接口中的方法在默认情况下是抽象的,因此,对它们使用这样的关键字没有任何意义。您总是可以避免它。反射还解释了为什么语言中允许匿名类中的公共方法(这些匿名类未在接口/超类中定义)有某种意义。@Ernest,反射不是访问它的唯一方法。看看保罗的答案。@Pacerier——你真的读过这个答案吗?特别是第二句和第三句?@ErnestFriedman Hill,你说过我们可以在匿名类中使用它,或者我们可以使用反射。你说没有别的办法了。你错了,因为我们也可以在匿名类之外访问它,正如Paul的回答所示。有一种方法不使用反射。看看保罗的答案。