当您编写无法访问的代码时,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
}
}
答案 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方法的另一种方法是使用它的另一种方法。在问之前我应该理解这一点。遗憾。