java匿名内部类无法访问的代码

时间:2011-01-21 08:04:24

标签: java inner-classes unreachable-code

当您编写无法访问的代码时,Java编译器会抱怨。例如

public void go()
{
    return;
    System.out.println("unreachable");
}

但是,当您在匿名类中定义一个无法从任何地方访问的新方法时,编译器不会抱怨。它允许你这样做,为什么? 例如,

class A
{
   public void go()
   {
     System.out.println("reachable - A");
   }
}
class B
{
   public static void main(String [] args)
   {
     A a = new A() {
              public void go()
              {
                System.out.println("reachable - B");
              }
              public void foo()
              {
                System.out.println("unreachable - B");
              }
           };
     a.go(); // valid
     a.foo(); // invalid, compiler error
  }
}

4 个答案:

答案 0 :(得分:5)

这只相当于允许你创建私有方法,这些方法在类中的任何地方都没有被调用。它完全不同于无法访问的代码 - 并且可以通过反射来访问。

这种情况可能会合理地发出警告(特别是在IDE上允许非常细粒度地​​调整警告),但我认为这不应该是错误。

答案 1 :(得分:5)

首先:Eclipse 通知我foo()从未在本地使用过。然而,由于其他anserws指出的原因,这是一个警告,而不是错误。

请注意,有一种方法可以到达foo()

new A() {
      public void go()
      {
        System.out.println("reachable - B");
      }
      public void foo()
      {
        System.out.println("unreachable - B");
      }
}.foo();

这是有效的,因为表达式new A() {}的类型不是A,而实际上是A的匿名子类。该子类有一个公共foo方法。

由于您不能拥有相同类型的变量,因此无法从变量访问foo()

答案 2 :(得分:4)

原则上,您可以通过反射在foo()上调用a方法,因此并非总是无法访问。

a.go();

之后尝试此操作
Method m = a.getClass().getDeclaredMethod("foo");
m.invoke(a);

答案 3 :(得分:0)

public void go()
{
   foo();
   System.out.println("reachable - B");
}

public void foo()
{
   System.out.println("unreachable - B");
}

到达foo方法的另一种方法是使用它的另一种方法。在问之前我应该​​理解这一点。遗憾。