2

当您编写无法访问的代码时,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

4 回答 4

5

这仅相当于允许您创建在类中的任何地方都不会调用的私有方法,真的。在完全相同的意义上,它不是不可访问的代码——它可以通过反射来访问。

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

于 2011-01-21T08:09:26.050 回答
5

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

请注意,有一种方法可以到达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()这种方式从变量访问。

于 2011-01-21T08:14:55.177 回答
4

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

之后试试这个a.go();

Method m = a.getClass().getDeclaredMethod("foo");
m.invoke(a);
于 2011-01-21T08:09:14.137 回答
0
public void go()
{
   foo();
   System.out.println("reachable - B");
}

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

只是到达 foo 方法的另一种方法,它可以使用该类的另一种方法。在问之前我应该​​明白这一点。对不起。

于 2011-01-21T12:50:29.273 回答